Claude Code hooks 与常驻会话监控

Claude Code 的 hooks 和常驻会话监控,常被当成「检测 AI 编码 Agent 何时需要人」的两种互相竞争的做法。更好的理解是:它们是两件职责不同的仪器

hook 之所以执行,是因为某个配置好的生命周期事件触发了。而监控回答的是一个持续的问题:在当下存在的这些会话里,哪一个在运行、在等待、被阻塞、已完成、卡住,或者已经不再活跃

Claude Code hooks 观察什么

官方的 Claude Code hooks 参考 按频率给事件分组。有些每个会话触发一次,比如 SessionStartSessionEnd;有些每个回合触发一次,比如 UserPromptSubmitStopStopFailure;其余的描述工具调用、授权请求、通知、子 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 降低延迟,并让事件含义变得明确。监控提供重启恢复、多会话上下文、过期,以及一个用来对账后续活动的地方。任何一个来源,都不该在没有身份与新鲜度检查的情况下被信任

实现清单

  1. 先定义这套系统是在自动化事件、在展示当前状态,还是两者都要
  2. 把每一个面向用户的状态,都连到能让它成立和让它撤销的证据上
  3. 用稳定的会话与回合身份做去重
  4. 把明确的完成与基于静默的卡住推断分开
  5. 测试那些取代更早 Stop 或授权事件的后续活动
  6. 测试重启恢复,且不重放一条旧通知
  7. 写明处理器的目的地和原始会话的数据流
  8. 把不受支持或互相矛盾的记录降级为 unknown

Agent Island 怎么用监控这一侧

Agent Island 是面向 Claude Code、Codex、Antigravity、Grok 和 Cursor 的免费、MIT 许可的状态伴侣。桌面 App 读取本地会话证据,显示实时会话状态和轮到你了提醒,并且不把会话数据上传到 Agent Island 的服务。它是一个观察者,不是 Agent 的控制器

当前稳定版本是 macOS 与 Windows 的 v1.7.1Claude 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 账号

下载 Agent Island,或者 先检视实现再安装

来源与核实日期

本文里的 Claude Code hook 名称与生命周期描述,于 2026 年 7 月 20 日对着官方 hooks 参考核对过。服务商接口会变,把某段配置搬进生产之前,请先核实当前的事件 schema