Claude Code 的 hooks 和常驻会话监控,常被当成「检测 AI 编码 Agent 何时需要人」的两种互相竞争的做法。更好的理解是:它们是两件职责不同的仪器
hook 之所以执行,是因为某个配置好的生命周期事件触发了。而监控回答的是一个持续的问题:在当下存在的这些会话里,哪一个在运行、在等待、被阻塞、已完成、卡住,或者已经不再活跃
Claude Code hooks 观察什么
官方的 Claude Code hooks 参考 按频率给事件分组。有些每个会话触发一次,比如 SessionStart 和 SessionEnd;有些每个回合触发一次,比如 UserPromptSubmit、Stop 和 StopFailure;其余的描述工具调用、授权请求、通知、子 Agent、任务、压缩和征询
这让 hooks 很适合事件驱动的工作:
- 在工具执行之前强制某条策略
- 在一个已知的生命周期点记录一条结构化事件
- 在工具成功之后跑格式化或测试
- 在一个回合停下时发一条通知
- 把某一个项目接进已有的本地工作流
同一份参考也记录了命令、HTTP、prompt、agent 和 MCP 工具处理器。这些处理器可以采取行动,而一个被动的状态监控通常不该
常驻监控重建什么
常驻监控把持久的会话记录与新鲜度、身份规则结合起来。它可以在编码会话开始之后才启动、可以在自己重启之后恢复,也可以在不要求每个项目都装同一个 hook 的前提下比较多个线程
这让监控很适合运维层面的可见性:
- 把所有本地可发现的会话放在一处显示
- 保住线程之间的区分
- 在之后出现用户活动时撤销一次旧的完成
- 在活动安静下来且没有终止事件时,推断出一个有界的卡住状态
- 在一个很小的状态模型背后支持不止一家编码 Agent 服务商
监控为这份覆盖付出的代价是更多推断。它必须解析各服务商特有的记录、容忍写到一半的内容、定义过期,并避免把文件系统元数据当成语义真相
实际对比
| 问题 | Claude Code hook | 常驻本地监控 |
|---|---|---|
| 它什么时候知道 | 配置的事件一触发就立刻知道 | 当监听器或扫描观察到新的持久证据时 |
| 它能不能阻断或改变行为 | 部分 hook 事件可以返回决定或执行动作 | 通常不能;观测应当与控制分开 |
| 它能熬过监控重启吗 | 那个事件必须被记到某个持久的地方 | 能,只要当前状态可以从持久的本地记录重建 |
| 它覆盖旧会话吗 | 只覆盖 hook 配置之后观察到的事件,除非另有日志 | 有可能,取决于新鲜度和受支持的记录格式 |
| 它覆盖多个项目吗 | 取决于用户、项目、插件、skill 或托管策略的作用域 | 可以跨项目发现受支持的本地会话 |
| 它覆盖其它服务商吗 | 只有 Claude Code 的生命周期 | 可以,每家服务商配一个独立的适配层和测试 |
| 主要的误报风险 | 把一个生命周期事件当成一个持续的当前状态 | 从过期、残缺或弱的证据里推断语义 |
| 主要的隐私问题 | 配置好的处理器把事件负载发到哪 | 监控在哪里读取、保留和传输会话产物 |
一个 Stop hook 能证明和不能证明什么
一个新鲜的 Stop 事件,是「某次回复结束了」的有力证据。它不是「五分钟之后这个会话仍然需要用户」的持久证明。用户可能已经回复了,另一个回合可能已经开始,之后的失败也可能改变了运行状态
反过来,一个看到近期文件活动的监控,可以合理地把会话归类为活跃,但光靠文件活动证明不了那次回复成功完成了。这与 AI 编码 Agent 会话状态分类法 里形式化的是同一个区分:事件是证据,状态是一个有时间边界的结论
当事件本身就是那份合同时,选 hooks
当你需要在一个写明的生命周期点上得到确定行为时,用 hooks。例子包括:执行前检查一条命令、写一条紧凑的本地审计事件、在工具结果之后启动测试,或者把一次授权请求接进已批准的工作流
把处理器写小。让写入幂等、在可用时带上会话与回合身份、限制执行时间,并决定失败是否应该阻断编码流程。一个通知 hook 不该悄悄变成一个策略 hook
当当前上下文才是那份合同时,选监控
当用户在切换窗口、重启监控或同时跑多个会话之后仍然需要一个稳定答案时,用监控。监控应该写明它的新鲜度窗口、支持的服务商、终止标记、取代规则和兜底行为
有用的监控还会区分 已完成 与 卡住。前者需要终止证据,后者是从先前的活动加上有界的静默推断出来的。回合层面的推理见 完成事件不等于会话状态
最强的设计往往是混合的
混合设计把 hooks 当成一个高质量的证据来源,把持久的本地会话记录当成恢复路径:
Claude Code 生命周期事件
|
v
一条小的本地 hook 记录 ---------+
|
原生会话产物 ------------------+--> 状态归约器 --> 界面 / 通知
|
进程与新鲜度证据 --------------+
hook 降低延迟,并让事件含义变得明确。监控提供重启恢复、多会话上下文、过期,以及一个用来对账后续活动的地方。任何一个来源,都不该在没有身份与新鲜度检查的情况下被信任
实现清单
- 先定义这套系统是在自动化事件、在展示当前状态,还是两者都要
- 把每一个面向用户的状态,都连到能让它成立和让它撤销的证据上
- 用稳定的会话与回合身份做去重
- 把明确的完成与基于静默的卡住推断分开
- 测试那些取代更早 Stop 或授权事件的后续活动
- 测试重启恢复,且不重放一条旧通知
- 写明处理器的目的地和原始会话的数据流
- 把不受支持或互相矛盾的记录降级为
unknown
Agent Island 怎么用监控这一侧
Agent Island 是面向 Claude Code、Codex、Antigravity、Grok 和 Cursor 的免费、MIT 许可的状态伴侣。桌面 App 读取本地会话证据,显示实时会话状态和轮到你了提醒,并且不把会话数据上传到 Agent Island 的服务。它是一个观察者,不是 Agent 的控制器
当前稳定版本是 macOS 与 Windows 的 v1.7.1。Claude Code 状态监控指南 描述面向用户的模型,隐私页 记录数据边界
安装或检视这份实现
用与你机器匹配的那个渠道。每条命令安装的都是当前的公开包;源码与 issue 跟踪器保持公开可查
# macOS
brew install tristan666666/tap/agentisland
# Windows Package Manager
winget install TristanTang.AgentIsland
# Scoop
scoop bucket add agent-island https://github.com/tristan666666/scoop-bucket
scoop install agent-island/agentisland
在 GitHub 上审阅源码、下载 最新的签名版本,或者从一个 good first issue 开始
盯状态,而不只是盯事件
如果你同时跑 Claude Code 和 Codex,Agent Island 提供一个本地视图,涵盖运行中、等待、已完成、被阻塞和卡住的会话,并在需要你处理时给出提醒。它免费、开源、支持 macOS 与 Windows,不需要 Agent Island 账号
来源与核实日期
本文里的 Claude Code hook 名称与生命周期描述,于 2026 年 7 月 20 日对着官方 hooks 参考核对过。服务商接口会变,把某段配置搬进生产之前,请先核实当前的事件 schema
