SessionEnd/Stop Hooks 无法正常工作 - 环境变量未设置且触发不稳定

Bug Report: SessionEnd/Stop Hooks 无法正常工作 - 环境变量未设置且触发不稳定

概述

iFlow CLI v0.5.13 的 hook 系统存在两个关键问题:

  1. 环境变量 IFLOW_HOOK_EVENT_NAME 从未被设置 — Hook 被调用但无法判断是哪个事件触发的
  2. SessionEnd/Stop hook 触发不稳定 — 有时触发,有时不触发

环境信息

  • iFlow CLI 版本: 0.5.13
  • 操作系统: Windows 10 (win32 10.0.19045)
  • Python 版本: 3.13.2

问题 1: IFLOW_HOOK_EVENT_NAME 环境变量未设置

描述

根据文档 (docs_cn/examples/hooks.md),hook 应该通过 IFLOW_HOOK_EVENT_NAME 环境变量接收事件名称。但是,当 hook 被调用时,这个变量从未被设置。

证据

调试日志显示 hook 接收到的环境变量:

[2026-02-22 11:05:31] Hook triggered: event=, all_iflow_envs={'IFLOW_AONE': 'false', 'IFLOW_CWD': 'E:\\Bak\\Users\\LG\\Documents\\Cli\\TTS', 'IFLOW_PROJECT_DIR': 'E:\\Bak\\Users\\LG\\Documents\\Cli\\TTS', 'IFLOW_SESSION_ID': 'session-dde90bd0-175f-4923-b840-9ebd126cbef4', 'IFLOW_TRANSCRIPT_PATH': '...'}

注意 event= 是空的,而且 all_iflow_envs 中没有 IFLOW_HOOK_EVENT_NAME

预期行为

IFLOW_HOOK_EVENT_NAME 环境变量应该被设置为以下值之一:

  • PreToolUse
  • PostToolUse
  • SessionEnd
  • Stop

实际行为

IFLOW_HOOK_EVENT_NAME 从未被设置,导致 hook 无法知道是哪个事件触发了调用。

临时解决方案

我们实现了启发式方法来检测事件类型:

  1. 检查是否有 stdin 数据(PreToolUse/PostToolUse 有 stdin 数据)
  2. 检查 stdin 数据内容(PostToolUse 包含 errorresult 字段)
  3. 无 stdin 数据则为 SessionEnd/Stop

问题 2: SessionEnd/Stop Hook 触发不稳定

描述

SessionEndStop hook 在会话结束时不稳定触发。有时正常工作,有时完全不触发。

复现步骤

  1. .iflow/settings.json 中配置 SessionEndStop hook
  2. 启动 iFlow CLI 会话
  3. 使用以下方式之一结束会话:
    • /exit 命令
    • 连续两次 Ctrl+C
  4. 检查 hook 是否被触发

证据

成功触发 SessionEnd:

[2026-02-22 11:07:49] Hook triggered: env_event=, all_iflow_envs={'IFLOW_CLI': '1'}
[2026-02-22 11:07:49] Detected event type: SessionEnd
[2026-02-22 11:07:49] SessionEnd/Stop handler called (detected)

未触发 SessionEnd(会话结束但没有 hook 调用):

[2026-02-22 11:20:34] Hook triggered: ... session-dde90bd0 ...
[2026-02-22 11:21:42] Hook triggered: ... session-d06a1667 ...  # 新会话开始了

注意两个会话之间没有 SessionEnd 事件。会话 dde90bd0 结束了,但没有触发 SessionEnd/Stop hook。

预期行为

SessionEnd hook 应在以下情况触发:

  • 用户执行 /exit 命令
  • 用户执行 /bye/quit 命令

Stop hook 应在以下情况触发:

  • 用户连续按两次 Ctrl+C
  • 主会话因任何原因结束

实际行为

SessionEnd/Stop hook 触发不稳定:

  • 有时触发(11:07:49, 11:18:19)
  • 有时不触发(11:20:34 和 11:21:42 之间)

Hook 配置

文件: .iflow/settings.json

{
  "hooks": {
    "SessionEnd": [
      {
        "command": "python",
        "args": [".iflow/hooks/tts_project_hook.py"]
      }
    ],
    "Stop": [
      {
        "command": "python", 
        "args": [".iflow/hooks/tts_project_hook.py"]
      }
    ],
    "PreToolUse": [
      {
        "command": "python",
        "args": [".iflow/hooks/tts_project_hook.py"]
      }
    ],
    "PostToolUse": [
      {
        "command": "python",
        "args": [".iflow/hooks/tts_project_hook.py"]
      }
    ]
  }
}

调试日志

[2026-02-22 11:05:31] Hook triggered: event=, all_iflow_envs={'IFLOW_AONE': 'false', ...}
[2026-02-22 11:07:39] stdin data detected, length=43777
[2026-02-22 11:07:39] Detected event type: PreToolUse
[2026-02-22 11:07:49] Hook triggered: env_event=, all_iflow_envs={'IFLOW_CLI': '1'}
[2026-02-22 11:07:49] Detected event type: SessionEnd  ✅ 成功触发
[2026-02-22 11:07:49] SessionEnd/Stop handler called (detected)
[2026-02-22 11:18:19] Hook triggered: env_event=, all_iflow_envs={'IFLOW_CLI': '1'}
[2026-02-22 11:18:19] Detected event type: SessionEnd  ✅ 成功触发
[2026-02-22 11:20:34] Hook triggered: ... session-dde90bd0 ...
[2026-02-22 11:20:34] Detected event type: PreToolUse
[2026-02-22 11:21:42] Hook triggered: ... session-d06a1667 ...  ❌ 新会话开始,但上一会话没有 SessionEnd
[2026-02-22 11:21:42] Detected event type: PreToolUse

影响

这些 bug 导致无法可靠地实现:

  • 会话清理任务
  • 会话结束通知
  • 文档更新提醒
  • 会话间状态持久化

建议修复方案

  1. 问题 1:确保在调用 hook 脚本前设置 IFLOW_HOOK_EVENT_NAME 环境变量
  2. 问题 2:确保无论会话如何结束,SessionEnd/Stop hook 都能被触发

相关文档

  • docs_cn/examples/hooks.md — 文档说明了 hook 系统和 IFLOW_HOOK_EVENT_NAME 变量
  • docs_cn/changelog.md — SessionEnd 和 Stop hook 在 v0.2.30 (2025-09-24) 版本添加

开工后我们验证下看看

请问这些调试日志是如何生成的呢

/log 可以试试