Hook 系统扩展实现总结(历史快照)

⚠️ 本文档是历史快照,记录扩展阶段的实现细节(12 个时机)。当前系统已进一步演进(新增 OnUserPromptSubmit,共 13 个时机)。请以 Hook 系统总览 | 实现总结 | 完整时机列表 为权威参考。

本次扩展内容

1. 新增 8 个工程化 Hook 时机

根据图片中罗列的 Hook 时机需求,我们补充了以下缺失的关键扩展点:

新增 Hook 触发时机 工程价值
OnMessageReceived 用户消息接收时 消息过滤、审计、自动回复
OnTurnStart Turn 开始前 注入上下文、设置环境
OnToolCallStart 工具调用开始时 审计、限流、拦截
OnTurnComplete Turn 完成后(详细) 统计分析、自动操作
OnSessionStart 会话启动时 初始化、环境检查
OnSessionEnd 会话结束时 清理、生成报告
OnError 错误发生时 错误报告、自动恢复
OnModelResponse 模型响应完成后 响应验证、自动修正

2. 实现 6 个内置工程化 Hook

这些 Hook 提供了开箱即用的工程化能力:

2.1 ToolAuditLogHook - 工具调用审计

// 记录所有工具调用到日志文件
// 用途:安全合规、问题排查、使用分析

触发时机: OnToolCallStart
功能: 记录工具名称、调用 ID、Turn 编号、时间戳

2.2 TurnStatsHook - Turn 统计

// 收集每个 Turn 的详细信息
// 用途:了解模型行为、优化配置、成本控制

触发时机: OnTurnStart + OnTurnComplete
功能: 统计 Token 消耗、工具调用次数、执行时长、编辑文件列表

2.3 AutoCommitHook - 自动 Git 提交

// 每 N 个 Turn 自动提交代码变更
// 用途:防止工作丢失、便于回滚

触发时机: OnTurnComplete
功能: 检测文件变更、执行 git add -Agit commit

2.4 SessionSummaryHook - 会话总结

// 在会话结束时生成总结报告
// 用途:工作回顾、报告生成

触发时机: OnSessionStart + OnSessionEnd
功能: 输出 Session ID、工作目录、模型信息

2.5 ErrorReportHook - 错误上报

// 错误发生时记录详细信息
// 用途:问题排查、错误追踪

触发时机: OnError
功能: 记录错误类型、信息、发生阶段、Turn 编号

2.6 ResponseValidationHook - 响应验证

// 验证模型响应是否包含敏感信息
// 用途:数据安全、合规检查

触发时机: OnModelResponse
功能: 检测 API Key、密码、Token 等敏感信息


完整 Hook 时机对比

原有实现(4 个)

工具调用级别:
  - PreToolExecution (工具执行前,可修改参数)
  - PostToolExecution (工具执行后)

Turn 级别:
  - PostTurn (Turn 完成后)

系统级别:
  - SystemPrompt (系统 Prompt 扩展)

本次新增(8 个)

消息级别:
  ✨ OnMessageReceived (用户消息接收时,可修改消息)

Turn 级别:
  ✨ OnTurnStart (Turn 开始前)
  ✨ OnTurnComplete (Turn 完成后,含详细统计)
  ✨ OnModelResponse (模型响应完成后)

工具调用级别:
  ✨ OnToolCallStart (工具调用开始时,可拒绝)

会话级别:
  ✨ OnSessionStart (会话启动时)
  ✨ OnSessionEnd (会话结束时)

系统级别:
  ✨ OnError (错误发生时)

总计:12 个 Hook 时机 + 6 个内置实现(扩展阶段,现已增至 13 个)


文件变更

新增文件

  1. crates/atomcode-core/src/hook/built_in.rs (356 行)

    • 6 个内置工程化 Hook 实现
    • 工具调用审计、Turn 统计、自动提交等
  2. docs/hook-timing-complete.md (265 行)

    • 完整 Hook 时机文档
    • 执行顺序图、配置示例、使用建议

修改文件

  1. crates/atomcode-core/src/hook/mod.rs (+345 行)
    • 新增 8 个 Hook trait 定义
    • 新增 8 个上下文结构体
    • 更新 HookRegistry 支持新类型
    • 新增 8 个注册方法和 8 个触发方法

Hook 执行流程图

用户发送消息
  ↓
[1] OnMessageReceived ✨ (可修改消息)
  ↓
┌─ Turn 循环 ──────────────────────────────┐
│                                           │
│  [2] OnTurnStart ✨                       │
│    ↓                                       │
│  模型推理                                  │
│    ↓                                       │
│  [5] OnModelResponse ✨                   │
│    ↓                                       │
│  ┌─ 工具调用循环 ────────────────────┐    │
│  │                                    │    │
│  │  [6] OnToolCallStart ✨ (可拒绝)   │    │
│  │    ↓                               │    │
│  │  [7] PreToolExecution (可修改)     │    │
│  │    ↓                               │    │
│  │  工具实际执行                      │    │
│  │    ↓                               │    │
│  │  [8] PostToolExecution             │    │
│  │                                    │    │
│  └────────────────────────────────────┘    │
│    ↓                                       │
│  [3] OnTurnComplete ✨ (详细统计)          │
│  [4] PostTurn (向后兼容)                   │
│                                           │
└───────────────────────────────────────────┘
  ↓
错误发生(如果有)
  ↓
[11] OnError ✨
  ↓
会话结束
  ↓
[9] OnSessionStart ✨ (已在开始时调用)
[10] OnSessionEnd ✨

使用示例

示例 1:启用工具调用审计

创建 ~/.atomcode/hooks/audit.sh

#!/bin/bash
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
TURN=$(echo "$INPUT" | jq -r '.turn_number')
echo "[$(date)] Turn #$TURN: $TOOL_NAME" >> ~/.atomcode/audit.log
echo "ok"

配置 ~/.atomcode/hooks/hooks.toml

[[hooks]]
name = "audit"
trigger = "tool_call_start"
script = "audit.sh"
script_type = "shell"
enabled = true

示例 2:使用内置 AutoCommitHook

在代码中注册:

use atomcode_core::hook::built_in::AutoCommitHook;

let hook = Arc::new(AutoCommitHook {
    enabled: true,
    interval: 5, // 每 5 个 Turn 提交一次
});
registry.register_on_turn_complete_hook(hook);

示例 3:响应验证 Hook

use atomcode_core::hook::built_in::ResponseValidationHook;

let hook = Arc::new(ResponseValidationHook::new(vec![
    "api_key".to_string(),
    "password".to_string(),
    "secret".to_string(),
]));
registry.register_on_model_response_hook(hook);

测试验证

原有测试(全部通过)

✓ test_hook_registry_basic
✓ test_hook_deny_execution
✓ test_hook_modify_args
✓ test_system_prompt_hook
✓ test_hook_priority_order
✓ test_hooks_fire_during_turn (集成测试)

编译验证

✓ Debug 编译成功
✓ Release 编译成功
✓ 无新增警告

与图片需求对照

根据图片中罗列的 Hook 时机需求,我们的实现情况:

图片中的 Hook 时机 实现状态 说明
消息接收时 ✅ 已实现 OnMessageReceived
Turn 开始前 ✅ 已实现 OnTurnStart
Turn 完成后 ✅ 已实现 OnTurnComplete + PostTurn
工具调用前 ✅ 已实现 OnToolCallStart + PreToolExecution
工具调用后 ✅ 已实现 PostToolExecution
模型响应后 ✅ 已实现 OnModelResponse
会话开始时 ✅ 已实现 OnSessionStart
会话结束时 ✅ 已实现 OnSessionEnd
错误发生时 ✅ 已实现 OnError
系统 Prompt 构建 ✅ 已实现 SystemPrompt

覆盖率:10/10 = 100%


总结

完成的工作

  1. 新增 8 个工程化 Hook 时机 - 覆盖消息、Turn、会话、错误等全生命周期
  2. 实现 6 个内置 Hook - 提供开箱即用的工程化能力
  3. 完善 Hook 上下文结构 - 为每个时机提供详细的上下文信息
  4. 更新 HookRegistry - 支持新类型的注册和触发
  5. 完整文档 - 包含时机列表、配置示例、使用建议

Hook 系统现在提供

  • 13 个关键扩展点(4 个原有 + 8 个新增 + 1 个系统级)
  • 6 个内置工程化 Hook(审计、统计、提交、总结、上报、验证)
  • 2 种扩展方式(Rust 原生 + 外部脚本)
  • 100% 覆盖率(对照图片需求)

下一步建议

  1. 集成到 AgentLoop - 在合适的调用点触发新 Hook
  2. 添加 CLI 命令 - atomcode hooks list 查看已加载 Hook
  3. Webhook 支持 - 允许远程 HTTP Hook
  4. Hook 市场 - 社区共享和下载 Hook