Skip to content

[Bug] Codex SessionEnd hook timeout=60 触发官方 3s 钳制,用户配置页报「钩子加载问题」 #381

Description

@jackdu2333

现象(Symptoms)

Codex 桌面端「用户配置 → 钩子」会显示红色警告:

此源有 1 个钩子加载问题
clamping SessionEnd hook timeout to 3s in ~/.codex/hooks.json

Memmy 安装/刷新 Codex 钩子后必现。把 SessionEnd.timeout 手工改成 3 可以消掉红条,但 Memmy 下次重写 hooks.json 会再次写成 60,警告复发。

环境(Environment)

  • macOS,Codex Desktop
  • Memmy Codex 集成写入:~/.codex/hooks.json
  • 钩子脚本:~/.codex/hooks/memmy-resume-hook.mjsClosing Memmy memory session
  • 本地实证:手工把 SessionEnd.timeout 改为 3 后,Memmy 于 2026-09-08 14:33 再次覆盖回 60(同时把 node 路径改成了 ChatGPT.app 内置 node)

复现步骤(Steps to reproduce)

  1. 安装/启用 Memmy 的 Codex 钩子(会写入 ~/.codex/hooks.json)。
  2. 打开 Codex 桌面端 → 用户配置 → 钩子。
  3. 看到 SessionEnd 超时被钳制的红条。
  4. (可选)把 SessionEnd.timeout 改成 3,红条消失。
  5. 再触发一次 Memmy 钩子安装/刷新,timeout 又变回 60,红条回来。

预期行为(Expected)

  • Memmy 写入的 Codex 钩子不应触发 Codex 的加载警告。
  • SessionEndtimeout 应不超过 Codex 硬上限 3 秒
  • 其它生命周期钩子(SessionStart / UserPromptSubmit / Stop / PostCompact)可以继续用 60 秒。

实际行为(Actual)

所有 Codex 钩子共用同一个常量:

const HOOK_TIMEOUT_SECONDS = 60;

codexHookEntries() 把这个值也写进了 SessionEnd。Codex 加载时把 60 钳制成 3,并在用户配置页标成「钩子加载问题」。

这不是钩子执行失败,但会一直显示为配置错误;用户手工修复也会被安装器覆盖。

根因分析(Root cause)

Codex 对 SessionEnd 有硬超时上限 3s(会话正在退出,不允许钩子拖太久)。超过 3 就会 clamp,并作为 hook loading problem 展示。

Memmy 当前把 60s 一视同仁写进全部 Codex hook,包括只做 closeRuntimeSessionSessionEnd

建议修复(Suggested fix)

SessionEnd 单独使用 timeout: 3,其余事件继续 HOOK_TIMEOUT_SECONDS = 60

需要改的两处(内容对称):

  • App/backend/src/adapters/outbound/skill-writer/codex/target.ts
    • HOOK_TIMEOUT_SECONDS = 60
    • hooks.SessionEnd = codexHookEntries(...) / codexHookEntries() 里的 timeout: HOOK_TIMEOUT_SECONDS
  • Memory/src/agent-source/integration/codex/target.ts(同样逻辑)

最小改法示例:

const HOOK_TIMEOUT_SECONDS = 60;
const SESSION_END_TIMEOUT_SECONDS = 3;

hooks.SessionEnd = codexHookEntries(
  hooks.SessionEnd,
  hookCommand,
  "Closing Memmy memory session",
  SESSION_END_TIMEOUT_SECONDS,
);

影响(Impact)

  • 所有启用 Memmy Codex 钩子的用户,配置页都会看到这条红条。
  • 手工改 timeout: 3 无法持久,因为安装器会覆盖 hooks.json
  • SessionEnd 实际仍按 3s 跑;当前钩子只是关闭会话,3s 通常够用。真正的问题是配置警告和覆盖循环。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions