时间线
时间线是 Previously 的中心,它以两种形态存在:一是你滚动的界面——对话旁一列按日期排列的切片时间轮;二是 agent 导航的记忆索引——一份从切片文件重建的目录,让 agent 拥有你过去的地图。两者都是同一份真相来源的投影:切片本身。
不是聊天列表,也不是搜索框
时间线是大多数 AI 聊天产品两种主流 UI 模式的明确替代。它不是需要你手动管理、重命名、删除和搜索的对话线程列表;也不是一个输入关键词、祈祷正确记忆浮现的搜索框。这两种模式都把整理记忆的负担推给了你。
Previously 拒绝这个假设。取而代之的是一条单一时间线——你的故事如同一部自传,最旧的在顶部,最新的在底部,实时对话在「现在」一端。
关键要点:你不需要管理对话。你只需滚动你的人生。
界面:对话旁的时间轮
聊天页是一个分栏视图:左侧是时间轮,右侧是对话——实时的或历史的。
时间轮是一条垂直的、虚拟化渲染的列表,包含你所有的切片——最旧在顶,最新在底,末端是一行「现在」,选中即回到实时对话。每行显示切片的日期、时间与 focus 行;时间戳随滚动以里程表的方式上下翻动,穿越过去如同拨动时钟。选中一个过去的切片,会播放一段时间旅行过渡:滚动数字时钟从你所在的位置转到目标切片的时刻,上方是加宽字距的 "PREVIOUSLY ON" 眉题,随后历史视图淡入——那一轮的逐字对话、它当时的思考、以及那个切片冻结时的用户卡快照。
抵达简报
当实时对话为空——初次抵达,或上一个切片关闭后回来——右侧不再是空白画布,而是抵达简报:电影标题卡式的 "PREVIOUSLY ON" 叠在你的名字之上,然后是从真实记忆生成的热启动摘要:上次的话题、延续至今的未决事项、一键发送的建议 chips。每个区块只在有真实数据时渲染——不会出现「上次聊到」后面什么都没有的情况。
索引:投影,不是第二份真相
时间线同时是切片档案之上持续维护的索引。设计原则只有一句:
切片是唯一真相来源;时间线是派生投影。 目录中的每个条目都能从切片文件重建,因此一个切片永远不会因为「时间线弄丢了它」而失联。
索引以几种渲染存在,全部位于 memory/episodic/ 下,全部可以再生成:
timeline/index.json—— 规范的结构化目录,供界面与工具消费。timeline.md—— 同一份目录的 Markdown 投影,按月、按日分组,最新在前。这是 recall 同事当作地图读取的文件。- 月度
_index.json—— 每个月目录下的精简条目数组,让界面无需读取每个文件就能浏览标题。
每个目录条目是一条带质感的指针——id、起止时间、轮数、focus、summary、tags、情绪基调、未决事项,以及一个 needs_marking 标志。一行足以判断相关性,但永远不足以据此作答:
- **2026-08-11-1115** 回顾上一份工作的绩效争议,与当下对比 · 14轮 · mixed [状态回忆, 职业反思]
weaveTimeline:工程化对账
索引由 weaveTimeline 维护——一个确定性的对账流程,零模型调用:
- 枚举磁盘上真实存在的切片目录——那是真相。
- 加载当前投影。
- Diff——磁盘上存在但目录里缺失的切片,从它的 frontmatter 补入;目录里有而磁盘上没有的条目(幻影)被丢弃。切片永远胜出。
- 重建——对照
strands.json解析每个条目的 strand 归属,按时间排序,写出各种投影。在一轮之内,这些写入并入这一轮同一次提交。
全量对账有节流,所以大多数时候它只是读取缓存;切片关闭的路径会强制对账,让刚关闭的切片立即可见。因为对账是结构性的,孤立切片——创建了却从未入索引、跨日才关闭——都会被自动拾起。
needs_marking:干切片队列
关闭时没有 focus/summary 的切片是干切片——对回忆而言是匿名的。对账把它们标记为 needs_marking 而不是藏起来,并有两个机制让这个计数持续下降:
- 关闭时的确定性兜底——分析器没给出完整标记时,切片带着确定性标记(首轮话题 + 标签)关闭,而不是空字段。
- 顺手回填——只在切片关闭的边界(绝不在一轮对话进行中),一次回填批次最多为 3 个干切片写入 focus/summary 并清除标志。契约上是尽力而为:回填失败绝不会拖垮一轮对话。
Agent 看到什么
系统提示词里带着一份时间线简报:大约十条最新的指针行,每行标注了你的本地日历(星期几、几天前——agent 无需做日期心算),外加目录总数。提示词里写得很明确:时间线的行是指针——某行看起来相关,先读切片再作答。
## Timeline (recent)
- **2026-08-11-1115**(08-11 周二 · 6 天前)回顾上一份工作的绩效争议… · 14轮 · mixed [状态回忆,…]
- **2026-08-10-1839** …
- 往前共 152 片,可回溯
随后的读取沿成本阶梯进行——永远先用最小的足够单元:
| 工具 | 谁在用 | 用途 |
|---|---|---|
recall(question) | 主 agent | 把问题交给回忆同事——主要的过去访问方式 |
readSlice | 主 agent | 只用于核验 recall 的回答 |
readTimelineWindow / readGlobalTimeline | recall 同事 | 时间轴:按日期窗口定位 |
readStrand / listStrands | recall 同事 | 主题轴:追踪一个话题穿过哪些切片 |
readSliceSummary | recall 同事 | 只看 frontmatter,判断相关性 |
readSlice(range 协议) | recall 同事 | 定点深读,全文配额最多 5 片 |
完整的检索纪律见回忆。
三条时间线
有一处命名重叠值得说明:每个切片目录内还有一个 timeline/ 子目录——那是产品所说的三条时间线中的两条:
core.md—— 共同的记录:你和 agent 实际说过的话。agent.md—— 它的思考:每个轮次背后的认知日志。- 你的生活 —— 第三条线,只有你知道;永远不会被写下的部分。
本页所讲的全局时间线,是所有切片的共享记录之上的目录——让上百个切片可以作为一条线来导航的索引。