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 接口,包含 typecategorydatapriority 等字段,用于精确描述捕获到的会话片段。

引擎覆盖了 PRD 中定义的 13 个主要事件类别,并在实际实现中扩展至 27 种以上。其映射逻辑清晰:

  • 工具调用到事件的映射:这是最基础的捕获层。

    • Bash 工具:被细分为 cwd(检测 cd 命令)、git(识别 commit、push、merge 等 18 种 git 操作)、error(基于退出码或错误标志)、env(检测 venv、nvm、export 等环境配置)以及 constraint(从错误中发现的平台限制)。
    • 文件操作工具EditWriteNotebookEdit 映射为 file_edit/file_writeRead 映射为 file_readGlobGrep 映射为 file_globfile_search
    • 计划模式工具EnterPlanModeExitPlanMode 以及对 .claude/plans/ 目录的写入操作,会被捕获为 plan_enterplan_exitplan_file_writeplan_approved 等事件,完整记录规划生命周期。
    • 任务与代理工具TodoWriteTaskCreateTaskUpdate 产生 task 类事件;Agent 工具的启动与完成分别产生 subagent_launchedsubagent_completed 事件,后者会携带结果摘要。
    • MCP 工具:所有以 mcp__ 开头的工具调用都会被捕获。引擎不仅记录调用(mcp_tool_call 事件),还会将工具的响应体拼接进去形成 mcp 事件,确保来自 Jira、Grafana 等外部系统的数据也能被 FTS5 索引和搜索。为安全起见,在序列化前会执行 redactSecrets 函数,对 api_keytoken 等敏感字段进行脱敏。
    • 用户决策工具AskUserQuestion 工具会生成 decision_question 事件,引擎会智能解析其 JSON 响应,只提取问题和用户选择的答案标签,避免将整个选项列表泄漏到事件数据中。
  • 用户消息的意图与状态检测:这是引擎最具创新性的部分,它实现了跨语言的结构化分析。

    • 意图分类:通过 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 CodeCLAUDE.md.claude/ 目录下的文件。
  • Codex CLIAGENTS.mdAGENTS.override.md 及其 memory 目录。
  • Gemini CLIGEMINI.md 及其 memory 目录。
  • QwenQWEN.md 及其 memory 目录。
  • KiroKIRO.md 及其 memory 目录。
  • VS Code Copilot.github/copilot-instructions.md
  • Cursor.cursor/context-mode.mdc

这种硬编码在提取器中的正则匹配策略(而非通过适配器分发)是一个关键的工程权衡,它换取了提取器的纯粹性、同步性和热路径安全性,代价是新增平台时需要更新此正则。其工作原理的细节可以在 Context Mode 的适配器系统全解 中找到更深入的阐述。

工程考量与安全设计

该引擎在设计中充分考虑了真实场景的复杂性与安全性:

  1. 上下文窗口节省:对于 ctx_fetch_and_index 等工具的响应,引擎会解析其前导信息(如 Fetched and indexed 5 sections (47.50KB)),将索引的数据量记录在事件的 bytes_avoided 字段中,为统计真实的上下文节省提供数据支撑。
  2. 错误处理isToolError 函数会仔细区分真实的工具错误和 Context Mode 自身生成的引导信息(以 context-mode: 开头),防止将指导文本误判为错误事件。
  3. 状态管理extractErrorResolution 函数维护了一个简单的错误状态机,可以检测到“错误后在同一工具或相关工具上成功”的模式,并生成 error_resolved 事件,追踪问题的解决过程。
  4. 隐私保护:如前所述,redactSecrets 函数会深度遍历工具输入的 JSON 结构,对任何键名包含敏感词(如 authorizationapi_key)的值进行脱敏替换为 [REDACTED],避免凭证意外写入本地数据库。

总结

Context Mode 的事件提取引擎远不止是一个日志收集器。它是一个精心设计的、面向会话连续性的数据理解层。通过将工具调用映射为语义明确的事件,并基于通用结构规则分析用户消息,它为后续的 FTS5 全文索引、跨会话恢复以及多平台的统计分析提供了高质量、结构化的输入。这个引擎是 Context Mode 能够实现其核心价值——让 AI 编码助手拥有“长期记忆”的关键组件。若想了解这些提取出的事件如何被用于构建快照并恢复会话,请参阅 Context Mode 会话连续性系统

FAQ

Q: 事件提取引擎如何处理非英语的用户消息? A: 引擎使用基于 Unicode 字符和文本结构的“通用规则检测器”,而非特定语言的关键词列表。例如,通过检测各种语言的问号(? ؟ ¿)来识别调查意图,通过分析消息的分隔符和长度来识别决策和角色指令。测试证明这对中文、阿拉伯语、俄语等 8 种语言都有效。

Q: 如果 AI 工具调用了敏感 API 并在输入中包含密钥,提取器会如何处理? A: 引擎在序列化任何 mcp__ 工具的 tool_input 前,会强制执行 redactSecrets 函数。该函数会递归扫描整个 JSON 对象,对任何键名匹配敏感模式(如 authorizationapi_keysecret)的值替换为 [REDACTED],确保敏感信息不会被持久化到本地的 SQLite 数据库中。