对话聚合
每个编程智能体都各自保存自己的历史。Claude Code 把对话记录写入 ~/.claude,Codex 写入 ~/.codex,OpenCode 写入一个本地数据库——各在其位、各用其格式,彼此互不可见。对话聚合把这一切汇集到一个工作区中:将 Codeg 指向一个项目,它就会扫描每个智能体的存储,查找你在那里运行过的会话,然后把它们与你 Codeg 原生的对话一并列出。
而且你导入的一切都不是僵死的存档。打开这些会话中的任意一个并继续下去——原来的智能体会带着完整无缺的历史接续话题。你上周在终端里开启的一段对话,会在 Codeg 的工作区中继续,仿佛从未离开过。更进一步:那份历史不再是写下它的那个智能体的私产——一个会话只要进了 Codeg,你就可以用 @ 提及它,把它所学到的交给任何智能体。
如何导入
导入在它自己的窗口中进行,因此你可以看清 Codeg 找到的一切,并选择要引入哪些。两种打开方式:
- 在对话侧边栏中,右键点击某个文件夹(或打开它的 ⋯ 菜单),选择导入本地会话。这会让你以该文件夹的新会话已勾选并滚动到视野中的状态开始。
- 或者使用文件夹区域标题上的导入按钮,从一张白纸开始。
两条路径都会打开导入本地会话窗口,它会:
- 先扫描。 它会遍历每个智能体的会话存储,并在过程中按智能体显示实时计数。历史记录庞大时会需要一点时间。
- 把找到的一切展示给你,按项目文件夹分组。可按标题或路径搜索、筛选到某一个智能体,或打开仅可导入以隐藏已经导入的内容。你可以勾选单个会话、勾选整个文件夹,或全选。
- 汇报它做了什么。 导入完成后你会得到一份导入完成摘要——多少个已导入、多少个已刷新、多少个已跳过,以及已创建文件夹、未找到和失败——然后是继续导入或关闭。
关于那个列表,有两点值得了解。你尚未在 Codeg 中打开过的文件夹会带有新增徽标——从其中导入时,Codeg 会为你创建该文件夹。而已经导入过的会话,或其文件此后已消失的会话,仍会列出但被锁定,并带有已导入或已删除徽标,因此你在确认之前就能看到哪些会被跳过。
- 一次即可覆盖全部。 扫描并不局限于你启动时所在的文件夹——它涵盖每一个受支持的智能体、它能找到的每一个项目,因此你可以一次性让整台机器的历史跟上进度。
- 它是按需进行的。 Codeg 从不在后台扫描,也不监视你的智能体文件。只有在你要求时会话才会出现,因此导入始终是一个有意为之的步骤。
- 它是本地的。 导入读取的是你机器上智能体自己的文件——不会上传任何内容,智能体的原始会话也保持不变。
- 没有对应项目文件夹的会话会被跳过,并在列表底部为你统计出来。
导入的会话会进入待复查
导入会把引入的内容标记为待复查而非已完成——它们是你尚未在 Codeg 中查看过的工作,而且既然侧边栏现在默认隐藏已完成的对话,这样能让它们保持可见。可从文件夹菜单用完成所有会话批量清空该队列。→ 侧边栏的显示选项
Codeg 匹配什么
一次扫描会查看 Codeg 支持的每一个智能体——甚至包括你尚未在 Codeg 中启用的那些。对于每一个,它都会读取该智能体的原生会话存储(Claude Code 的 ~/.claude/projects、Codex 的 ~/.codex/sessions、OpenCode 的本地数据库等等),并推断出每个会话是在哪个项目目录中运行的。
这个路径就是全部规则:会话会被归入你运行它时所在的目录。 因此你得到的列表就是每个智能体的历史,按项目分组——而且,即便是你在使用 Codeg 很久之前就配置好的智能体,只要它的文件还在磁盘上,也依然能浮现出它过往的工作。
→ 支持的智能体 列出了每个智能体保存会话的位置。
移动过项目?
会话是按它们运行时所在的目录路径来归类的。如果你此后重命名或移动了项目文件夹,它较早的会话仍然指向旧路径——因此它们会被归到那个旧位置下,而不是该文件夹的新家。
已导入、已更新、已跳过
导入结束时的摘要会确切告诉你发生了什么:
- 已导入——添加到列表中的全新会话。
- 已刷新——已经在 Codeg 中的会话,与该智能体自己的存储如今所记录的内容同步了:它的标题,以及它的最近活动时间。许多智能体只有在会话运行一段时间后才为其命名,因此稍后的一次导入会拾取那个名称;而你在智能体自带 CLI 里一直继续使用的会话,现在按你真正最后动它的时间排序,而不是按你当初导入它的时间。
名字现在来自智能体,而且它一有名字就用上
有两处修复改变了会话名字的来源。Codex 会话显示的是 Codex 给它们起的标题——Codeg 从前退回到用第一条用户消息,而 Codex 把真正的标题保存在它自己的会话索引里,于是同一个会话在两边读起来不一样。而从 0.28 起,一个实时会话会在智能体一选定标题的那一刻就用上它,不必等到重新加载。
你亲手起的名字仍然胜过这两者。而由待办任务卡片启动的会话会保留卡片的名字——它从前会在第一次加载详情时被智能体自己的文件解析结果覆盖掉,对于不写标题的智能体来说,那就是所拼提示词的第一行。现在重命名卡片就会重命名它产生的会话;更早那些运行留下的会话已在升级时修好。
- 已跳过——已经存在且无内容需要更新的会话。
- 已创建文件夹——尚未在你工作区中、因此被一并添加的项目。
- 未找到与失败——文件已消失的会话,以及任何出错的项目(并列出详情)。
正因为有这样的区分,重新导入始终是安全的。 在一段工作会话之后再运行一次,你就能拉入新增的内容,而不打扰已有的内容:Codeg 不会重复某个会话、不会覆盖你自己设置的标题,也不会打乱你的列表。重命名、置顶和状态都归你,不会被动过。你甚至在点击之前就能看到这一点——任何已经导入的内容都带有已导入徽标和一个锁定的复选框。
你自己起的名字会被保留
用 /rename(或 claude -n,或在选择器里按 Ctrl+R)重命名过的 Claude Code 会话,导入时用的就是那个名字,而不是模型自己写的摘要。CodeBuddy 同理。如果你重命名过不止一次,最近的那次胜出。
从上次中断处继续
以下这一点让聚合不只是一个历史查看器:导入的会话是活的。 打开一个会话,它看起来就和其他任何对话一样——完整的对话记录,直接从智能体自己的文件中读取。输入一条提示词,原来的智能体就会重新连接到那个会话,把之前的一切作为上下文继续下去。
- 由原来的智能体处理。 导入的 Codex 会话会用 Codex 恢复,Claude Code 会话则用 Claude Code——Codeg 按 id 把各自的会话交还给对应的智能体,因此不会在转手过程中丢失任何上下文。
- 历史来自磁盘。 每次你打开会话,Codeg 都会重新读取智能体的对话记录,因此你看到的始终是真实内容,绝不是过时的副本。这也是导入之所以快的原因:它记录的是每个会话所在的位置,而不是它的第二份副本。
- 当某个会话无法重新打开时——智能体此后在它那一侧让它过期或删除了它——Codeg 会告知你,并主动提供重新加载或以一个新对话取而代之的选项,而不是把你晾在一边。
除了以待复查状态开始之外,导入的对话不会受到任何特殊对待——它们按时间新近程度排列在你的历史中,会在搜索(⌘K)中出现,行为与你在 Codeg 中开启的对话完全一样。
用 @ 引用过往会话
聚合真正的回报不在于那份列表,而在于任何智能体都可以被指向任何其他智能体的历史。 一个会话只要进了 Codeg,用 @ 提及它,你正在对话的那个智能体就能读到里面发生了什么。一段 Claude Code 的对话可以去查上周二某个 Codex 会话做了什么;一个 Grok 会话可以接续某个 OpenCode 会话的思路。智能体之间看不到彼此的存储,但 Codeg 看得到,于是它站在中间代为查询。
如何引用一个会话。 在 composer 中输入 @,然后从会话分组中选取。这份列表涵盖你工作区中的每一个对话——每个智能体、每个文件夹,导入的和 Codeg 原生的一视同仁,无论状态如何——每一行都带着所属智能体的图标,标题旁是它的分支或状态。输入内容会同时按标题和智能体过滤,因此 codex 会把列表收窄到 Codex 的会话。选中一个,它就作为徽标落入你的消息中。
智能体能读到什么。 这个提及会解析出该会话的标题、由哪个智能体运行、它的状态、它的工作区文件夹与分支、它的模型和令牌用量,以及最近若干回合的精简视图——足以弄清尝试过什么、什么奏效了、又是在哪里停下的。有两点是它刻意不做的:
- 只读。 引用一个会话既不会恢复它,也不会改动它。若要真正接续一个会话,请打开它——参见从上次中断的地方继续。
- 不是上下文的搬运。 智能体拿到的是一份概览视图,而不是另一个会话逐字的完整记录。对于很长的历史,请说清你想从中得到什么——"查清它是怎么配置重试逻辑的"胜过"读一下这个会话"。
它有几种颇能派上用场的方式:
@[周二的 Codex 会话] 在迁移上卡住了。
读一下它尝试过什么,然后换一条思路来做。- 跨智能体交接。 把上个月的终端工作扫描进来,然后让你今天更喜欢的那个智能体在其基础上继续——接手的不必是当初那个智能体。
- 找回的是推理过程,而不只是 diff。 git 告诉你改了什么;做出那处改动的会话才告诉你为什么要那样做。
- 低成本地为一个全新会话做交代。 与其把一段长长的线程重新解释一遍,不如新开一个再指向旧的那个——当一个对话长到不便继续工作时尤其有用。
- 与委派结合起来。 主导智能体可以读一个被引用的会话,然后把后续工作交给子智能体。→ 多智能体协作
这需要在设置 → 通用中打开获取会话信息——它默认就是开启的。如果被引用的会话此后已被删除,查询只会如实报告这一情况,而不会失败。→ 设置 → 通用