<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Claude-Code on EVILSTAR</title><link>https://80b55ee1.hugo-blog-ddc.pages.dev/tags/claude-code/</link><description>Recent content in Claude-Code on EVILSTAR</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 14 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://80b55ee1.hugo-blog-ddc.pages.dev/tags/claude-code/index.xml" rel="self" type="application/rss+xml"/><item><title>为了找回散落的 session，我做了一个 Claude Code / Codex 会话管理器</title><link>https://80b55ee1.hugo-blog-ddc.pages.dev/posts/agent-session-manage-architecture/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://80b55ee1.hugo-blog-ddc.pages.dev/posts/agent-session-manage-architecture/</guid><description>&lt;p&gt;最近这段时间，我在本地同时用 &lt;strong&gt;Claude Code&lt;/strong&gt; 和 &lt;strong&gt;Codex&lt;/strong&gt; 做开发的频率越来越高。&lt;/p&gt;
&lt;p&gt;工具一多，一个很烦的问题就开始反复出现：&lt;strong&gt;session 太难找了&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;有些对话在 Claude 里，有些在 Codex 里；有些项目我开了很多个 worktree；有时候我只记得一句提问、一个报错，或者记得那次对话大概发生在哪个分支上，但就是想不起来它到底在哪个 session 里。&lt;/p&gt;
&lt;p&gt;还有一个更现实的问题：两个工具也不是总能顺手可用。&lt;/p&gt;
&lt;p&gt;有时候 Claude 这边刚好不方便用，有时候 Codex 状态不对；还有些时候，Claude 这轮表现不太符合我预期，我会很自然地想：&lt;strong&gt;这段上下文能不能直接切到 Codex 继续？&lt;/strong&gt; 反过来也一样。&lt;/p&gt;
&lt;p&gt;但实际操作往往很别扭。你要先把旧对话翻出来，再复制上下文，再尝试在另一边接上。如果之前那个 session 本身就已经埋在一堆历史记录里，光是“找到它”这一步，就足够把思路打断。&lt;/p&gt;
&lt;p&gt;所以我做了这个项目：&lt;strong&gt;Agent Session Manage&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;项目地址：&lt;a href="https://github.com/evilstar9527/agent-session-manage"&gt;https://github.com/evilstar9527/agent-session-manage&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;它不是一个新的 agent，也不是一个新的聊天工具。更准确地说，它是一个本地的会话管理器：把 Claude Code 和 Codex 的历史会话统一索引起来，让我可以更快地搜索、查看、恢复、导出，并且在需要的时候，尽量平滑地把对话切换到另一个工具里继续。&lt;/p&gt;
&lt;h2 id="我想做的其实不是另一个聊天应用"&gt;我想做的，其实不是“另一个聊天应用”&lt;/h2&gt;
&lt;p&gt;这个项目一开始的定位就很明确：&lt;strong&gt;我不想重新发明 Claude Code 或 Codex，我只是想把它们已经产生出来的 session 管理得更顺手一点。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以它解决的问题也非常具体：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;历史 session 不好找&lt;/li&gt;
&lt;li&gt;想恢复旧对话时路径不顺手&lt;/li&gt;
&lt;li&gt;想在 Claude 和 Codex 之间切换时很麻烦&lt;/li&gt;
&lt;li&gt;想把有价值的对话沉淀下来时，没有一个舒服的出口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这也决定了它的设计方向：它不接管原始数据，不改变原有 CLI 的工作方式，而是站在旁边，做一层 &lt;strong&gt;索引、检索和操作层&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果只用一句话概括，我会这样描述它：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;它是一个以本地 Claude Code / Codex 会话文件为输入、以统一会话模型为中间层、以 SQLite 为索引层、同时提供 CLI 和桌面 UI 的本地会话管理器。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这里面最重要的是三件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;真实数据源仍然是本地会话文件&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不同来源要先归一成统一模型&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQLite 只是索引层，不是 source of truth&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我很喜欢这种结构，因为它很克制。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude 的会话还是 Claude 的会话&lt;/li&gt;
&lt;li&gt;Codex 的会话还是 Codex 的会话&lt;/li&gt;
&lt;li&gt;这个工具只是让它们更容易被找到和继续使用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;哪怕有一天本地索引库删了，重新扫描也就回来了。&lt;/p&gt;
&lt;h2 id="这套架构大概长什么样"&gt;这套架构大概长什么样&lt;/h2&gt;
&lt;p&gt;先看一张总图：&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
subgraph Entry["入口层"]
CLI["CLI\nsrc/cli.ts"]
UI["React UI\nsrc/ui/App.tsx"]
end
subgraph Desktop["桌面端桥接层"]
Main["Electron Main\nsrc/desktop/main.ts"]
IPC["IPC Handlers\nsrc/desktop/ipc.ts"]
Watcher["Session Watcher\nsrc/desktop/session-watcher.ts"]
end
subgraph Core["核心业务层"]
Service["SessionService\nsrc/app/session-service.ts"]
Indexer["Indexer\nsrc/indexer/index.ts"]
Discovery["Discovery\nsrc/discovery/*"]
Parsers["Parsers\nsrc/parsers/*"]
Model["CanonicalSession\nsrc/model/session.ts"]
Repo["SessionRepository\nsrc/store/repo.ts"]
Export["Markdown Export\nsrc/export/markdown.ts"]
Convert["Format Convert\nsrc/convert/*"]
end
subgraph Storage["存储层"]
SourceFiles["源会话文件\n~/.claude/projects\n~/.codex/sessions\n~/.codex/archived_sessions"]
SQLite["本地索引库\n~/.agent-session-manage/index.sqlite"]
end
CLI --&gt; Service
UI --&gt; IPC --&gt; Service
Main --&gt; IPC
Main --&gt; Watcher
Watcher --&gt; Service
Service --&gt; Indexer
Indexer --&gt; Discovery
Discovery --&gt; SourceFiles
Indexer --&gt; Parsers
Parsers --&gt; Model
Service --&gt; Repo
Model --&gt; Repo
Repo --&gt; SQLite
Service --&gt; Export
Service --&gt; Convert
Convert --&gt; SourceFiles
&lt;/div&gt;
&lt;p&gt;如果用更直白的话来说，它的工作方式其实很简单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;先找到本地会话文件
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; 解析成统一格式
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; 写进本地索引库
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -&amp;gt; 在此基础上提供搜索、查看、恢复、导出、转换能力
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;整个项目最关键的点，不是 Electron，也不是 SQLite，而是中间那层统一模型。因为只有先把不同来源的 session 整理成同一类对象，后面的搜索、导出、恢复、切换这些功能，才值得做，也才不会越写越乱。&lt;/p&gt;
&lt;h2 id="为什么我坚持先做统一模型"&gt;为什么我坚持先做“统一模型”&lt;/h2&gt;
&lt;p&gt;如果没有这层抽象，事情会很快变得很糟。&lt;/p&gt;
&lt;p&gt;你很快就会遇到这种问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索 Claude 和搜索 Codex 的逻辑不一样&lt;/li&gt;
&lt;li&gt;导出 Claude 和导出 Codex 的逻辑不一样&lt;/li&gt;
&lt;li&gt;恢复命令生成也不一样&lt;/li&gt;
&lt;li&gt;转换逻辑会散在一堆条件分支里&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以我一开始就把核心抽象放在 &lt;code&gt;src/model/session.ts&lt;/code&gt; 的 &lt;code&gt;CanonicalSession&lt;/code&gt; 上。&lt;/p&gt;
&lt;p&gt;它的含义并不复杂：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不管输入来自 Claude 还是 Codex，最后都尽量整理成同一类会话对象。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个对象里最重要的信息包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;session 基本信息&lt;/li&gt;
&lt;li&gt;project path&lt;/li&gt;
&lt;li&gt;git branch&lt;/li&gt;
&lt;li&gt;title / summary&lt;/li&gt;
&lt;li&gt;messages&lt;/li&gt;
&lt;li&gt;tool calls&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一旦这层统一了，很多能力都会顺着长出来：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索&lt;/li&gt;
&lt;li&gt;查看详情&lt;/li&gt;
&lt;li&gt;pin / archive&lt;/li&gt;
&lt;li&gt;resume-command&lt;/li&gt;
&lt;li&gt;export markdown&lt;/li&gt;
&lt;li&gt;Claude / Codex 间转换&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它们不需要为每个来源单独再做一遍。&lt;/p&gt;
&lt;h2 id="会话是怎么被发现解析和导入的"&gt;会话是怎么被发现、解析和导入的&lt;/h2&gt;
&lt;p&gt;这部分主要分三步：&lt;strong&gt;发现文件、解析格式、写入索引&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="第一步发现文件"&gt;第一步：发现文件&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;src/discovery/claude.ts&lt;/code&gt; 会去递归找 Claude 的 &lt;code&gt;.jsonl&lt;/code&gt;，&lt;code&gt;src/discovery/codex.ts&lt;/code&gt; 会扫描 Codex 的 &lt;code&gt;rollout-*.jsonl&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里我没有做什么“万能规则引擎”，而是明确针对两种来源分别适配。&lt;/p&gt;
&lt;p&gt;我现在越来越喜欢这种写法：&lt;strong&gt;知道格式不一样，就老老实实分别处理。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这通常比“看起来很优雅但到处例外”的抽象更稳。&lt;/p&gt;
&lt;h3 id="第二步解析格式"&gt;第二步：解析格式&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;src/parsers/claude.ts&lt;/code&gt; 和 &lt;code&gt;src/parsers/codex.ts&lt;/code&gt; 会把原始 JSONL 整理成统一模型。&lt;/p&gt;
&lt;p&gt;它们做的不是简单地把 JSON 读出来，而是做一层有目的的提炼，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;抽出用户和助手消息&lt;/li&gt;
&lt;li&gt;整理 tool call / tool result&lt;/li&gt;
&lt;li&gt;推断标题&lt;/li&gt;
&lt;li&gt;记录 project path、branch、source session id&lt;/li&gt;
&lt;li&gt;留一些 metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里有一个现实我很早就接受了：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这种转换不可能 100% 无损。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以这个项目的目标从来不是“完整重建另一个工具的所有内部运行状态”，而是做&lt;strong&gt;实用型归一化&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;也就是说，它优先服务的是这些场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我想找回旧对话&lt;/li&gt;
&lt;li&gt;我想搜里面提到过什么&lt;/li&gt;
&lt;li&gt;我想恢复上下文继续工作&lt;/li&gt;
&lt;li&gt;我想把它导出来，或者迁到另一个工具里继续&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而不是去做一个协议层面的完美镜像。&lt;/p&gt;
&lt;h3 id="第三步写入索引"&gt;第三步：写入索引&lt;/h3&gt;
&lt;p&gt;扫描导入流程在 &lt;code&gt;src/indexer/index.ts&lt;/code&gt;，真正的落库存取在 &lt;code&gt;src/store/repo.ts&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里我比较满意的一个点是：&lt;strong&gt;它不是每次都傻傻地全量重建。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;repo 层会保存文件指纹，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;size&lt;/li&gt;
&lt;li&gt;mtime&lt;/li&gt;
&lt;li&gt;quickHash&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果文件没变，就直接跳过，不重复解析。&lt;/p&gt;
&lt;p&gt;这个优化听起来不大，但对本地工具很重要。因为 session 一旦真的积累起来，数量会涨得很快。如果每次都全量扫一遍，体验很快就会变差。&lt;/p&gt;
&lt;h2 id="为什么我把业务逻辑集中在-sessionservice"&gt;为什么我把业务逻辑集中在 SessionService&lt;/h2&gt;
&lt;p&gt;这个项目里我比较刻意的一件事，是把业务能力尽量都收敛到 &lt;code&gt;src/app/session-service.ts&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;它统一暴露了这些接口：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;scan()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;search()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pin()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;archive()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exportMarkdown()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;convert()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getResumeCommand()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;launchResume()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样做最大的好处就是：&lt;strong&gt;CLI 和桌面端都可以变得很薄。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/cli.ts&lt;/code&gt; 只需要负责参数解析、调用 service、打印结果。桌面端的 &lt;code&gt;src/desktop/ipc.ts&lt;/code&gt; 也只是把前端操作映射到 service 上。&lt;/p&gt;
&lt;p&gt;这对我来说很重要，因为 UI 通常是变化最快的部分，但 discovery、parser、store、service 这些底层能力往往更稳定。只要边界划清楚，后面加功能时就不会到处互相牵扯。&lt;/p&gt;
&lt;h2 id="桌面端为什么还要做-watcher"&gt;桌面端为什么还要做 watcher&lt;/h2&gt;
&lt;p&gt;如果只有 CLI，心智其实很简单：想刷新就手动 &lt;code&gt;scan&lt;/code&gt;，想找东西就用命令查。&lt;/p&gt;
&lt;p&gt;但桌面端不一样。桌面端一旦存在，用户就会自然期待：&lt;strong&gt;它应该自己知道数据变了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以我做了 &lt;code&gt;src/desktop/session-watcher.ts&lt;/code&gt;，去监听：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude projects 目录&lt;/li&gt;
&lt;li&gt;Codex sessions 目录&lt;/li&gt;
&lt;li&gt;Codex archived_sessions 目录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文件变化后，它不会立刻全量扫描，而是做一个小防抖，再通知窗口刷新列表。&lt;/p&gt;
&lt;p&gt;这个功能很朴素，但体验差别非常大。没有它的时候，桌面应用更像一个“偶尔手动刷新的浏览器”；有了它以后，它才更像一个真正的本地工作台。&lt;/p&gt;
&lt;h2 id="对我来说最有价值的不是搜索而是可以继续用"&gt;对我来说，最有价值的不是搜索，而是“可以继续用”&lt;/h2&gt;
&lt;p&gt;我后来越来越觉得，这个项目最值钱的地方，并不是“我终于能搜到某个 session 了”，而是搜到之后，&lt;strong&gt;我真的可以继续拿它工作&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="1-可以直接恢复原生会话"&gt;1. 可以直接恢复原生会话&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;SessionService.getResumeCommand()&lt;/code&gt; 会根据来源生成原生命令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude 走 &lt;code&gt;claude --resume&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Codex 走 &lt;code&gt;codex resume&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而且桌面端还能直接帮我在终端里打开它。&lt;/p&gt;
&lt;p&gt;这件事的关键不在命令本身，而在于它让“找回旧对话”和“继续工作”真正连起来了。&lt;/p&gt;
&lt;h3 id="2-可以导出成-markdown"&gt;2. 可以导出成 Markdown&lt;/h3&gt;
&lt;p&gt;很多 agent 对话并不只是一次性的。我经常会碰到一些值得留存的内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;某次排障过程&lt;/li&gt;
&lt;li&gt;某次重构思路&lt;/li&gt;
&lt;li&gt;某段工具调用和输出&lt;/li&gt;
&lt;li&gt;某轮讨论过的取舍&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当它能导出成 Markdown，它就更像一份资料，而不是一段只能被埋在工具目录里的聊天历史。&lt;/p&gt;
&lt;h3 id="3-可以在-claude-和-codex-之间切换"&gt;3. 可以在 Claude 和 Codex 之间切换&lt;/h3&gt;
&lt;p&gt;这其实最接近我做这个项目的初始动机。&lt;/p&gt;
&lt;p&gt;我并不是想做一个“理论上完美兼容”的格式转换器，我真正想要的是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当我对 Claude 当前这轮表现不满意，或者 Claude 这边暂时不好用时，我能不能尽量少折腾地把上下文迁到 Codex 去继续？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;反过来也一样。&lt;/p&gt;
&lt;p&gt;所以 conversion 的目标从来不是无损复刻，而是&lt;strong&gt;尽可能保住上下文的实用价值&lt;/strong&gt;。只要它能让我少做一次上下文重建，少打断一次工作流，这个能力就已经很有意义了。&lt;/p&gt;
&lt;h2 id="这套架构为什么我觉得是对的"&gt;这套架构为什么我觉得是对的&lt;/h2&gt;
&lt;p&gt;如果回头看，这个项目能站住，核心原因其实就一句话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我没有把它当成“另一个聊天应用”，而是把它当成“已有会话的管理层”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个定位影响了几乎所有设计决策。&lt;/p&gt;
&lt;p&gt;它不接管原始数据，不试图取代 Claude Code 或 Codex，也不追求协议层面的完美洁癖。它优先解决的是工作流问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;能不能找到 session&lt;/li&gt;
&lt;li&gt;能不能快速恢复&lt;/li&gt;
&lt;li&gt;能不能把上下文切到另一边继续&lt;/li&gt;
&lt;li&gt;能不能把历史沉淀下来&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我觉得这才是它真正应该服务的场景。&lt;/p&gt;
&lt;h2 id="当然它现在也还不完美"&gt;当然，它现在也还不完美&lt;/h2&gt;
&lt;p&gt;至少在我自己看来，还有几件事是后面会继续做的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索还能更强，比如更好的全文索引和过滤组合&lt;/li&gt;
&lt;li&gt;前端现在还能继续拆，尤其是 session 详情和筛选部分&lt;/li&gt;
&lt;li&gt;转换能力永远有边界，这件事只能尽量做好，不能假装它是完全无损的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但这些都不影响它现在已经解决了我最在意的那部分问题：&lt;strong&gt;把那些原本很容易沉下去的 session，重新变成可以找、可以看、可以接着用的东西。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;我做 &lt;code&gt;Agent Session Manage&lt;/code&gt; 的原因其实不复杂：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;session 越来越多，越来越难找&lt;/li&gt;
&lt;li&gt;我经常在 Claude Code 和 Codex 之间切换&lt;/li&gt;
&lt;li&gt;有时候其中一边不能用&lt;/li&gt;
&lt;li&gt;有时候只是单纯想把一段上下文换到另一边继续&lt;/li&gt;
&lt;li&gt;我也希望把这些历史对话变成可以搜索、恢复、导出、沉淀的东西&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以最后做出来的，不是一个新的 agent，而是一个本地会话管理器。&lt;/p&gt;
&lt;p&gt;如果再用一句话来概括它，我现在更愿意写成这样：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这不是一个“重新发明 agent”的项目，而是一个把 Claude Code 和 Codex 的历史会话重新组织起来，让它们更容易被找到、更容易被继续使用的工具。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对我来说，这种工具真正重要的地方，不是技术栈本身，而是它能不能减少上下文切换的摩擦，能不能把那些本来很容易沉下去的 session，重新变成可以用起来的工作资产。&lt;/p&gt;</description></item></channel></rss>