时间旅行
Chronicle 的标志性功能:点击会话中的任意一条消息,即可看到代码在那一刻的确切样貌——它由 Git 历史重建而来。
回放(Playback)模式正是"时间机器"这个名字名副其实之处。你不再是滚动浏览一份扁平的对话记录,而是在会话中穿行,看着代码库随之在下方发生变化。这里没有独立的快照存储,也不依赖你当前的工作树——Chronicle 会把每条消息的时间戳与你的 Git 历史相匹配,并据此重建整个文件树和文件内容。Git 是代码状态的唯一真相来源。
回放布局
打开一个会话,切换到 Playback(左侧栏,或按 ⌘2)。这是一个三栏视图:
- 对话列表(左)。 每一条消息都按角色分类——User、Assistant、Thinking、Tool Call、Tool Result——使用与应用其余部分一致的、准确对应角色的标签。点击一条消息即可选中它。较长的消息会截断,并提供"Show all"切换按钮;在超大会话中,Chronicle 会围绕你的选中项渲染约 400 行的窗口(配有"earlier / later messages"按钮),让滚动保持流畅。
- 代码快照(中)。 所选消息那一刻的文件树和文件内容。
- TimberLine(底部)。 用于拖动定位的整个会话时间线。
选中一条消息会同时驱动其他两个面板。
快照是如何解析出来的
当你点击一条消息时,Chronicle 会取出它的时间戳,并向 Git 请求该时间点或之前最近的一次提交(server/git.js 中的 commitAt(),它运行 git rev-list -1 --before)。这次提交便成为快照:
- 文件树是该提交处的
git ls-tree。 - 选中某个文件后,会通过
git show <commit>:<file>显示它的内容。 - 在该提交中被改动过的文件会在树中显示一个绿点,并且第一个会被自动选中,让你直接落到 AI 当时实际改动的地方。
如果某条消息早于全部历史记录,Chronicle 会回退到最早的一次提交,并给它标上**"before first commit"**徽章,这样你就知道自己看到的是最早可用的状态,而不是一次精确匹配。
注意: 快照是重建出来的历史,而不是你当前的磁盘内容。你看到的是文件在那次提交时的样子——不是你此刻工作树里的内容,也不是某个未提交的中间状态。
差异视图
按 D(或代码工具栏中的 ± Diff 按钮)来切换差异视图。它会将所选文件与其前一个已提交版本进行比较,并内联渲染新增/删除的行。大段未改动的行会被压缩为几行上下文(配有"··· N unchanged lines ···"标记),让真正的改动更加醒目。如果该文件在此快照处并未实际改动,Chronicle 会明确告诉你,而不是显示一份空的差异。
TimberLine
TimberLine 是把对话时间与代码时间联系起来的拖动条。它的标记:
- 蓝点——用户消息
- 绿方块——Git 提交
- 灰刻度——AI 和工具事件
与它交互:
- 点击或拖动任意位置进行定位。Chronicle 会吸附到最近的消息,并更新快照以匹配。
- 悬停可查看光标下方的时间戳。
- 当时间线获得焦点时:
←/→将光标微调 1%,Home/End跳到会话的开头或结尾。
在超大会话中,时间线会对 AI/工具刻度做抽稀(降到约 600 个)以保持清晰——但提交总是会被渲染,因为它们是让时间旅行得以运作的锚点。
Git 前置条件与保真度
时间旅行需要一个带有提交的 Git 仓库。如果项目不是仓库(或没有任何提交),代码面板会显示"No Git history"的空状态,并说明对话回放仍然可用——只是没有快照而已。项目的 Git 标签和标题会让你一眼看清仓库状态(参见 项目管理)。
保真度随提交频率而变化:Chronicle 只能在你的历史确实记录的时间点上重建代码,因此一个频繁提交的项目会让回放更紧凑、更准确,而一个只有寥寥几次大提交的项目则不然。要了解快照引擎的完整工作方式——提交匹配、文件树/文件解析、合并提交处理——请参见 Git 快照引擎。