现象(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.mjs(Closing Memmy memory session)
- 本地实证:手工把
SessionEnd.timeout 改为 3 后,Memmy 于 2026-09-08 14:33 再次覆盖回 60(同时把 node 路径改成了 ChatGPT.app 内置 node)
复现步骤(Steps to reproduce)
- 安装/启用 Memmy 的 Codex 钩子(会写入
~/.codex/hooks.json)。
- 打开 Codex 桌面端 → 用户配置 → 钩子。
- 看到 SessionEnd 超时被钳制的红条。
- (可选)把
SessionEnd.timeout 改成 3,红条消失。
- 再触发一次 Memmy 钩子安装/刷新,
timeout 又变回 60,红条回来。
预期行为(Expected)
- Memmy 写入的 Codex 钩子不应触发 Codex 的加载警告。
SessionEnd 的 timeout 应不超过 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,包括只做 closeRuntimeSession 的 SessionEnd。
建议修复(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 通常够用。真正的问题是配置警告和覆盖循环。
现象(Symptoms)
Codex 桌面端「用户配置 → 钩子」会显示红色警告:
Memmy 安装/刷新 Codex 钩子后必现。把
SessionEnd.timeout手工改成3可以消掉红条,但 Memmy 下次重写hooks.json会再次写成 60,警告复发。环境(Environment)
~/.codex/hooks.json~/.codex/hooks/memmy-resume-hook.mjs(Closing Memmy memory session)SessionEnd.timeout改为3后,Memmy 于 2026-09-08 14:33 再次覆盖回60(同时把 node 路径改成了 ChatGPT.app 内置 node)复现步骤(Steps to reproduce)
~/.codex/hooks.json)。SessionEnd.timeout改成3,红条消失。timeout又变回60,红条回来。预期行为(Expected)
SessionEnd的timeout应不超过 Codex 硬上限 3 秒。SessionStart/UserPromptSubmit/Stop/PostCompact)可以继续用 60 秒。实际行为(Actual)
所有 Codex 钩子共用同一个常量:
codexHookEntries()把这个值也写进了SessionEnd。Codex 加载时把 60 钳制成 3,并在用户配置页标成「钩子加载问题」。这不是钩子执行失败,但会一直显示为配置错误;用户手工修复也会被安装器覆盖。
根因分析(Root cause)
Codex 对
SessionEnd有硬超时上限 3s(会话正在退出,不允许钩子拖太久)。超过 3 就会 clamp,并作为 hook loading problem 展示。Memmy 当前把 60s 一视同仁写进全部 Codex hook,包括只做
closeRuntimeSession的SessionEnd。建议修复(Suggested fix)
SessionEnd单独使用timeout: 3,其余事件继续HOOK_TIMEOUT_SECONDS = 60。需要改的两处(内容对称):
App/backend/src/adapters/outbound/skill-writer/codex/target.tsHOOK_TIMEOUT_SECONDS = 60hooks.SessionEnd = codexHookEntries(...)/codexHookEntries()里的timeout: HOOK_TIMEOUT_SECONDSMemory/src/agent-source/integration/codex/target.ts(同样逻辑)最小改法示例:
影响(Impact)
timeout: 3无法持久,因为安装器会覆盖hooks.json。