Context Mode 的事件提取引擎是一个纯函数模块,它系统性地从各种 AI 编码工具调用(如 Bash、Edit、Read)和用户消息中,捕获并分类 13 种以上的结构化会话事件。该引擎的核心设计基于跨语言、跨平台的“结构化规则检测”,无需依赖特定语言的关键词列表,即可准确识别用户意图(investigate/implement)、决策(decision)、角色(role)和阻塞状态(blocker)。这些事件被持久化到 SQLite FTS5 知识库中,是 Context Mode 实现会话连续性、降低约 98% 上下文窗口占用的关键基础。更多关于上下文节省机制的原理,请参阅 Context Mode 全面解析。
Context Mode 的事件提取引擎:跨语言、跨工具的会话事件捕获与分类
在 AI 编码助手的长对话中,会话历史迅速膨胀会吞噬宝贵的上下文窗口,导致任务中断和“失忆”。Context Mode 通过其事件提取引擎(定义在 src/session/extract.ts)构建了一道精准的数据滤网,将原始的工具交互与用户对话转化为高信号密度的结构化事件。这些事件是后续进行 FTS5 搜索、会话恢复和跨平台统计的基石。
核心设计:纯函数与全面的事件分类
事件提取引擎被设计为一组纯函数,不产生任何副作用,确保其在高频的 PreToolUse 钩子中安全、快速地运行。它定义了一个统一的 SessionEvent 接口,包含 type、category、data、priority 等字段,用于精确描述捕获到的会话片段。
引擎覆盖了 PRD 中定义的 13 个主要事件类别,并在实际实现中扩展至 27 种以上。其映射逻辑清晰:
-
工具调用到事件的映射:这是最基础的捕获层。
- Bash 工具:被细分为
cwd(检测cd命令)、git(识别 commit、push、merge 等 18 种 git 操作)、error(基于退出码或错误标志)、env(检测 venv、nvm、export 等环境配置)以及constraint(从错误中发现的平台限制)。 - 文件操作工具:
Edit、Write、NotebookEdit映射为file_edit/file_write;Read映射为file_read;Glob和Grep映射为file_glob和file_search。 - 计划模式工具:
EnterPlanMode、ExitPlanMode以及对.claude/plans/目录的写入操作,会被捕获为plan_enter、plan_exit、plan_file_write、plan_approved等事件,完整记录规划生命周期。 - 任务与代理工具:
TodoWrite、TaskCreate、TaskUpdate产生task类事件;Agent工具的启动与完成分别产生subagent_launched和subagent_completed事件,后者会携带结果摘要。 - MCP 工具:所有以
mcp__开头的工具调用都会被捕获。引擎不仅记录调用(mcp_tool_call事件),还会将工具的响应体拼接进去形成mcp事件,确保来自 Jira、Grafana 等外部系统的数据也能被 FTS5 索引和搜索。为安全起见,在序列化前会执行redactSecrets函数,对api_key、token等敏感字段进行脱敏。 - 用户决策工具:
AskUserQuestion工具会生成decision_question事件,引擎会智能解析其 JSON 响应,只提取问题和用户选择的答案标签,避免将整个选项列表泄漏到事件数据中。
- Bash 工具:被细分为
-
用户消息的意图与状态检测:这是引擎最具创新性的部分,它实现了跨语言的结构化分析。
- 意图分类:通过
extractIntent函数,基于 Unicode 问号字符(??؟¿)的检测,将含有问句的消息分类为investigate(调查)意图;对于不含问号且长度短于 60 个码点的消息,则分类为implement(实现)意图。测试文件extract-multilang.test.ts中的 48 组回归矩阵证明,此方法对英语、中文、阿拉伯语、西班牙语、印地语、日语、土耳其语和俄语均有效。 - 决策、角色与阻塞检测:这三个分类器均采用“通用规则检测器”设计,不依赖任何语言的关键词,而是分析消息的结构特征。
- 决策(decision):检测包含分隔符(如逗号、分号、全角逗号)且长度适中的非问句消息(如“不要用 setState,用 useReducer”)。
- 角色(role):检测长度适中(8-120码点)、首句为非问句、且具有足够词汇密度(如两个字母单词或连续6个字母)的人设指令(如“You are a senior backend engineer”)。
- 阻塞状态(blocker/blocker_resolved):检测消息中是否包含编程领域通用的错误标记(如
Error:、Traceback)或解决标记(如✓、✅、fixed:)。 这些检测器共同构成了一个强大且可扩展的意图理解层,其测试覆盖了 8 种语言×5 个类别的完整矩阵,确保了行为的稳健性。
- 意图分类:通过
跨平台规则文件的智能识别
事件提取引擎另一项关键能力是识别不同 AI 编码平台的“指令文件”。当 Read 工具读取这些文件时,引擎会同时生成一个高优先级的 rule 事件和一个 file_read 事件,确保这些重要的上下文规则(如用户偏好、项目约定)能被优先保存并在会话压缩后恢复。
通过 extract-rule-detection.test.ts 可以看到,其识别范围覆盖了所有主流平台:
- Claude Code 的
CLAUDE.md和.claude/目录下的文件。 - Codex CLI 的
AGENTS.md、AGENTS.override.md及其memory目录。 - Gemini CLI 的
GEMINI.md及其memory目录。 - Qwen 的
QWEN.md及其memory目录。 - Kiro 的
KIRO.md及其memory目录。 - VS Code Copilot 的
.github/copilot-instructions.md。 - Cursor 的
.cursor/context-mode.mdc。
这种硬编码在提取器中的正则匹配策略(而非通过适配器分发)是一个关键的工程权衡,它换取了提取器的纯粹性、同步性和热路径安全性,代价是新增平台时需要更新此正则。其工作原理的细节可以在 Context Mode 的适配器系统全解 中找到更深入的阐述。
工程考量与安全设计
该引擎在设计中充分考虑了真实场景的复杂性与安全性:
- 上下文窗口节省:对于
ctx_fetch_and_index等工具的响应,引擎会解析其前导信息(如Fetched and indexed 5 sections (47.50KB)),将索引的数据量记录在事件的bytes_avoided字段中,为统计真实的上下文节省提供数据支撑。 - 错误处理:
isToolError函数会仔细区分真实的工具错误和 Context Mode 自身生成的引导信息(以context-mode:开头),防止将指导文本误判为错误事件。 - 状态管理:
extractErrorResolution函数维护了一个简单的错误状态机,可以检测到“错误后在同一工具或相关工具上成功”的模式,并生成error_resolved事件,追踪问题的解决过程。 - 隐私保护:如前所述,
redactSecrets函数会深度遍历工具输入的 JSON 结构,对任何键名包含敏感词(如authorization、api_key)的值进行脱敏替换为[REDACTED],避免凭证意外写入本地数据库。
总结
Context Mode 的事件提取引擎远不止是一个日志收集器。它是一个精心设计的、面向会话连续性的数据理解层。通过将工具调用映射为语义明确的事件,并基于通用结构规则分析用户消息,它为后续的 FTS5 全文索引、跨会话恢复以及多平台的统计分析提供了高质量、结构化的输入。这个引擎是 Context Mode 能够实现其核心价值——让 AI 编码助手拥有“长期记忆”的关键组件。若想了解这些提取出的事件如何被用于构建快照并恢复会话,请参阅 Context Mode 会话连续性系统。
FAQ
Q: 事件提取引擎如何处理非英语的用户消息?
A: 引擎使用基于 Unicode 字符和文本结构的“通用规则检测器”,而非特定语言的关键词列表。例如,通过检测各种语言的问号(? ? ؟ ¿)来识别调查意图,通过分析消息的分隔符和长度来识别决策和角色指令。测试证明这对中文、阿拉伯语、俄语等 8 种语言都有效。
Q: 如果 AI 工具调用了敏感 API 并在输入中包含密钥,提取器会如何处理?
A: 引擎在序列化任何 mcp__ 工具的 tool_input 前,会强制执行 redactSecrets 函数。该函数会递归扫描整个 JSON 对象,对任何键名匹配敏感模式(如 authorization、api_key、secret)的值替换为 [REDACTED],确保敏感信息不会被持久化到本地的 SQLite 数据库中。