save-hook.js
定义与身份
save-hook.js 是 claude-mem Hook 生命周期里的一个脚本实体,对应五阶段模型中的第 3 阶段 PostToolUse。
已知资料明确把该阶段写成:PostToolUse → save-hook.js。它不是会话开始阶段脚本,也不是停止或结束阶段脚本;其职责定位专门发生在 Claude 已经使用某个工具之后。
所属阶段与触发时机
在 Hook Lifecycle - Claude-Mem 摘要 所展示的五阶段表中,第 3 阶段为:
- Stage:3. PostToolUse
- Hook:
save-hook.js - Trigger:Claude uses any tool
- Purpose:Queue observation for AI compression
这表示 save-hook.js 的触发条件不是“用户打开会话”,也不是“用户提交 prompt”,而是 Claude 发生任意工具使用行为时 触发。原表中使用的是 any tool,说明这里的范围是泛化的工具调用事件,而不是仅限某一个特定工具。
角色职责
save-hook.js 的核心作用是:Queue observation for AI compression。
按原文语义,这里的重点不是立即完成 AI 压缩本身,而是把 observation 放入后续处理队列,交给异步流程处理。这与该架构“扩展侧不阻塞、工作进程异步处理”的总体设计一致。
换句话说,save-hook.js 在职责上更接近“记录并排队”这一层,而不是“当场生成总结”或“结束会话清理”。
配置方式
在 hooks 配置中,PostToolUse 阶段对 save-hook.js 的调用方式被明确写为:
"PostToolUse": [{
"matcher": "*",
"hooks": [{
"type": "command",
"command": "node ${CLAUDE_PLUGIN_ROOT}/scripts/save-hook.js",
"timeout": 120
}]
}]
可以从这段配置确认几个关键信息:
- 它挂载在
PostToolUse键下。 matcher为*,表示该阶段匹配所有该类事件,而不是更窄的子集。- 执行类型是
command。 - 具体调用命令是
node ${CLAUDE_PLUGIN_ROOT}/scripts/save-hook.js。 - 配置超时是 120 秒。
关键信息
1. 五阶段映射关系
save-hook.js 在五阶段生命周期中的固定映射是:
- SessionStart →
context-hook.js - UserPromptSubmit →
new-hook.js - PostToolUse →
save-hook.js Stop→summary-hook.jsSessionEnd→cleanup-hook.js
其中,save-hook.js 只对应第 3 阶段,而不负责其他阶段的任务。
2. 作用不是总结而是排队
文档对其作用的原始表述是 Queue observation for AI compression。因此应把它理解为“把观察记录送入 AI 压缩队列”,而不是直接生成 summary-hook.js 那种会话总结结果。
3. 超时边界
在 hooks 配置里,save-hook.js 的超时时间是 120 秒。这是配置层已明确给出的数字,不应写成模糊的“较长超时”或“默认超时”。
细节与边界
它处理的是工具使用后的阶段
原始五阶段表把触发写成 Claude uses any tool。因此,save-hook.js 的生效前提是工具调用已经发生;它不是会话启动注入上下文的脚本,也不是用户刚提交 prompt 时初始化会话的脚本。
它的职责与异步处理架构相容
同一份生命周期说明还给出总体架构原则:扩展进程不阻塞,工作进程异步处理 observation。结合 save-hook.js 的用途“Queue observation for AI compression”,可以确定它位于“采集后进入异步压缩流程”的位置,而不是同步完成全部 AI 处理。
文档没有在当前片段中展开其 stdin/stdout 协议
与 context-hook.js 相比,当前可见片段没有进一步给出 save-hook.js 的输入输出 JSON 结构、内部处理步骤或源码实现路径。因此本页只能严格确认它的生命周期位置、触发条件、命令调用方式、超时值和职责描述,不能擅自补写未出现的接口细节。
与其他 Hook 的区别
- UserPromptSubmit /
new-hook.js:用于创建或获取 session、保存 prompt、初始化 worker,不等同于 save-hook.js 的工具后 observation 排队职责。 - SessionStart /
context-hook.js:用于注入先前上下文,不负责工具调用后的记录排队。 summary-hook.js:发生在Stop阶段,负责生成会话总结,而不是 observation 入队。- cleanup-hook.js:发生在会话结束时,用于标记 session completed,不负责 AI 压缩队列。