OpenChronicle 记忆数据流全解从 S1 解析到 FTS5 索引的 5 级压缩漏斗【免费下载链接】OpenChronicle项目地址: https://gitcode.com/gh_mirrors/op/OpenChronicleOpenChronicle 是一个开源、本地优先的 AI Agent 记忆系统它在 macOS 上持续捕获你的屏幕上下文AX 可访问性树通过一条5 级压缩漏斗把原始事件逐级压缩成可读的 Markdown 记忆并最终建入SQLite FTS5 全文索引让任意支持工具调用的 AI Agent 都能快速检索你正在做什么、做过什么决定。️ 一眼看懂5 级压缩漏斗总览整条数据流只有一条入口没有多模式分支。每一级都只做一件事输出有界、prompt 可控级别阶段输入 → 输出核心动作1️⃣S0 分发 S1 解析AX 事件流 → 结构化 JSON 捕获去抖、去重提取focused_element/visible_text/url2️⃣Timeline 归一化原始捕获 → 1 分钟时间块保字面归一化剔除 UI 噪音3️⃣会话切割 S2 归约时间块 → 会话级日记条目按空闲/切换/超时切会话5 分钟增量刷写4️⃣Classifier 分类日记条目 → 结构化记忆文件提取持久事实写入 user-/project-/person- 等文件5️⃣FTS5 索引 MCP 检索Markdown 捕获 → 索引库BM25 全文检索Agent 随时可查官方对整体管线的完整描述见 docs/architecture.md端到端流程图与运行时序列都在里面。1️⃣ 第一级S1 解析——把屏幕事件变成结构化上下文macOS 的屏幕信号来自一个 Swift 编写的mac-ax-watcher二进制它订阅所有应用的可访问性事件窗口聚焦、输入值变化、标题变化每个事件吐出一行 JSON。原始事件像消防水带一样嘈杂先要过S0 分发器event_dispatcher.py的四道时间闸旋钮默认值作用debounce_seconds3.0s连续击键只触发一次捕获dedup_interval_seconds1.0s同类型事件直接丢弃min_capture_gap_seconds2.0s两次捕获的硬性最小间隔same_window_dedup_seconds5.0s同窗口非聚焦事件折叠之后才是真正的S1 解析s1_parser.py。它从庞大的 AX 树里只抽取下游 LLM 真正需要的三个字段focused_element—— 光标所在元素你正在输入什么、选中了哪一行visible_text—— 屏幕上可见内容的 Markdown 渲染上限约 10 KBurl—— 从可见文本中正则提取的网址这一步是压缩的关键起手下游所有 LLM 阶段读的都是这三个字段而不是动辄 200–400 KB 的原始 AX 树。捕获结果以{时间戳}.json写入~/.openchronicle/capture-buffer/细节见 docs/capture.md。2️⃣ 第二级Timeline 时间块——1 分钟一格的保真存档如果直接把原始捕获丢给归约器prompt 预算瞬间爆掉。于是 Timeline 阶段timeline/aggregator.py每 60 秒扫描一次已关闭的整分钟窗口对齐真实时钟如[10:00, 10:01)调用 LLM 把窗口内最多 30 条捕获归一化成一组活动记录[Notes] 购物清单: 用户起草清单最新版本 milk, eggs, flour, butter [Chrome] ACME Q3 roadmap (https://docs.example/roadmap): 阅读文档记录 Owner Alice它的规则非常克制核心是verbatim-preserving保字面✅ 用户亲手输入的文字、URL、窗口标题、专名——原样保留绝不改写✅ 剔除 UI 框架噪音、折叠重复快照✅ 防幻觉不同对话里的人/话题不得互相串供时间块存入 SQLite 的timeline_blocks表timeline/store.py(start_time, end_time)唯一键保证幂等。设计动机完整解释见 docs/timeline.md。3️⃣ 第三级会话切割 S2 归约——一段专注工作成为日记条目人的记忆单位不是事件而是一段专注的工作session。session/manager.py 用三条规则切分会话规则条件默认直觉 硬切空闲超过 5 分钟你去吃饭了会话在停下来那一刻结束 软切单个无关应用持续聚焦 3 分钟你转去看视频了快速多应用切换时自动豁免⏰ 超时会话超过 2 小时兜底防止会话失控会话结束后S2 归约器writer/session_reducer.py把时间范围内的所有时间块交给 LLM压缩成一条带精确时间范围的日记条目追加到当天的event-YYYY-MM-DD.md。亮点在于增量刷写长会话期间每 5 分钟就 flush 一次[flush]标记的条目长工作不会被先写后丢地漏报——这正是 v1 逐捕获写入踩过的坑。会话状态机、重试队列5/15/30/60/120 分钟退避与书签机制flush_end/classified_end见 docs/session.md 和 docs/writer.md。4️⃣ 第四级Classifier 分类——从活动日志提炼持久记忆活动日志回答今天做了什么但用户换了新公司、Alice 是设计负责人这类持久事实需要单独沉淀。Classifierwriter/classifier.py每 30 分钟活跃会话中加会话结束时各跑一轮通过一个有上限12 次迭代的工具调用循环操作记忆库工具用途read_memory/search_memory追加前先去重append/create写入新事实supersede事实变更时划线取代永不删除commit结束本轮无持久信号时直接空提交它默认偏向什么都不做纯粹的刷了 2 小时 Cursor 不算可分类事实。最终产出的是~/.openchronicle/memory/下一系列人类可读的 Markdown 文件——user-*.md、project-*.md、tool-*.md、topic-*.md、person-*.md、org-*.md。文件结构、supersede 语义、压缩compact保护机制见 docs/memory-format.md完整记忆规范也是 MCPget_schema返回的内容在 prompts/schema.md。5️⃣ 第五级FTS5 索引——让记忆秒级可查最后一级是检索。store/fts.py 里建了两套 FTS5 虚拟表全部使用unicode61 remove_diacritics 2分词器大小写不敏感、Unicode 友好索引表索引对象支撑的 MCP 工具entries_fts压缩后的记忆条目Markdown 层search/list_memories/read_memorycaptures_fts原始捕获的 S1 字段visible_text、url…search_captures/current_context两层设计的妙处压缩层答我知道什么原始捕获层答屏幕上当时到底写了什么。MCP 服务端明确教会 Agent 这个下钻路径——先查压缩层查不到再搜原始层。几个工程细节值得留意SQLite WAL 模式MCP 读与写入方并存不互锁paths.py 管理~/.openchronicle/index.db路径触发器同步captures表的插入/删除/更新由触发器自动同步进captures_fts索引不漂移随时可重建openchronicle rebuild-index从 Markdown 全量重建entries_ftsrebuild-captures-index同理——索引永远只是派生副本Agent 入口守护进程内置只读 MCP 服务http://127.0.0.1:8742/mcpClaude Code、Claude Desktop、Codex 等一次配置即可接入详见 docs/mcp.md 磁盘上你能看到什么跑起来之后一切状态都摊在~/.openchronicle/下随手可查~/.openchronicle/ ├── capture-buffer/ # 第一级S1 增强 JSON 捕获 ├── index.db # SQLitetimeline_blocks / sessions / FTS5 ├── memory/ # 第四、五级Markdown 记忆 索引 │ ├── index.md # 自动生成的总览 │ ├── event-2026-04-22.md │ └── user-/project-/person-… .md └── logs/ # 每个阶段一份日志方便排查常用巡检命令openchronicle status守护进程状态、openchronicle timeline list看时间块、openchronicle writer run补跑未完成的会话、openchronicle rebuild-index重建 FTS5 索引。 小结为什么是漏斗而不是一把梭OpenChronicle 的数据流把压缩和分类刻意拆开每级 prompt 有界——S1 只给结构化字段Timeline 只给 1 分钟窗口S2 只给时间块Classifier 看到的已是会话级摘要保真与压缩分层——用户亲手输入的文字在每一级都被verbatim保护压缩的是 UI 噪音而非事实永不删除——记忆变更走 supersede 划线取代FTS5 索引可随时从 Markdown 重建整条链可审计、可手工修复。想动手体验安装只需 macOS 13 与 Xcode Command Line Tools克隆仓库后执行bash install.sh再运行openchronicle start即可。更多配置与模型选择见 docs/config.md遇到问题可查 docs/troubleshooting.md。【免费下载链接】OpenChronicle项目地址: https://gitcode.com/gh_mirrors/op/OpenChronicle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考