session-import
将 Codex 本地会话和 DeepSeek Harness 导出的会话 ZIP 导入 DeepSeek Harness(DSH),在确认导入时选择目标工作区和会话模式。
插件包名为 dsh-session-import,界面入口为 会话导入,位于侧栏底部、设置上方。点击入口打开浮窗:可以拖动标题区域移动,也可以拖动上下左右边缘调整大小。标题、来源切换和搜索框固定,只有会话列表在内容超出时滚动。
使用方法 · 安装 · 会话来源设置 · 格式与限制 · 常见问题 · 开发
使用方法
导入 Codex 会话

- 打开侧栏的 会话导入,选择 Codex。
- 点击 加载会话。打开浮窗时不会自动扫描。
- 展开工作区,或使用搜索框查找工作区、路径或会话标题。
- 点击会话旁的 导入,选择目标工作区和会话模式。
- 点击 确认导入。成功后刷新 DSH 会话列表,即可在目标工作区查看。
选择 保留原工作区 时,插件按会话记录中的路径查找或创建 DSH 工作区。需要导入到其他目录时,先在 DSH 中添加目标工作区,再在导入窗口选择它。
列表按“工作区 → 会话”分组,同一个会话 ID 只显示一次;标题相同但 ID 不同的会话仍分别显示。多数据目录中存在同一会话时,优先采用更新时间较新的副本,时间相同则比较文件修改时间。
标题优先使用可读取的 Codex SQLite 数据库中的自定义名称,再使用 session_index.jsonl 中的名称,随后回退到数据库标题或会话 ID。工作区分组优先使用明确的项目 ID,没有 ID 时按项目名称合并,最后按路径分组。能够识别的后台审查和子代理记录会被过滤。
导入 DeepSeek Harness 会话 ZIP

- 打开 会话导入,选择 DeepSeek Harness。
- 点击 导入会话,选择一个或多个 DSH 导出的 ZIP 文件。
- 解析后的会话按“工作区 → 会话”展示,重复选择同一会话 ID 会更新其预览。
- 展开工作区,点击会话旁的 导入,选择目标工作区并检查会话模式。
- 点击 确认导入。成功后刷新 DSH 会话列表。
选择 ZIP 只解析和预览,点击确认后才保存。预览显示用户消息、助手消息数量,并提示未结束的回合。导入不会自动执行历史工具调用。
跨系统迁移时,例如把 Windows 的 ZIP 导入 macOS,如果原工作区路径不适用于本机,必须选择本机目标工作区。
会话模式与重复导入
Codex 会话和未记录模式的 DSH 归档,可以在确认导入前选择当前 DSH 提供的模式,默认采用 DSH 默认模式。已记录 agentPreset 的 DSH 归档保留原模式。导入完成后,已有历史的会话模式会锁定。
已导入的会话显示 已导入。再次导入时会先弹出确认提示,继续后创建一个具有新 ID 的副本,保留已有记录。当前没有原地覆盖功能,因此重新导入后,DSH 侧栏可能出现同名会话。
安装
准备并构建
当前开发依赖通过 link:../deepseek-harness/... 连接到 Harness 源码,构建需要两个仓库位于同一父目录:
your-directory/
├── deepseek-harness/
└── session-import/
准备 Git、Node.js 和 pnpm,版本要求以所用 Harness 版本为准。如果已有 Harness 源码,可以直接使用;首次准备可执行:
git clone https://github.com/deepseek-ai/deepseek-harness.git
git clone https://github.com/rinneditor/session-import.git
cd deepseek-harness
pnpm install
pnpm run build
cd ../session-import
pnpm install
pnpm build
构建生成 lib/index.js 后端入口和 lib/client.js 浏览器入口。Harness 需要支持 sidebar.footer.action 扩展槽,并满足本插件 package.json 声明的依赖要求。
当前源码依赖相邻目录,仅把 GitHub 地址交给包管理器不能保证在独立环境中完成构建。请使用已构建的本地目录安装。
安装到 Web
在 DSH 的 插件 页面选择 添加插件,输入已构建插件的本地绝对路径,例如 /absolute/path/session-import,安装并启用 dsh-session-import。
也可以在 Harness 源码目录使用 CLI 安装到 web profile:
pnpm dsh plugin --profile web add "/absolute/path/session-import"
pnpm dsh web
将示例路径替换为本机插件目录。首次安装后重启 Web 服务并刷新页面,检查侧栏是否出现 会话导入。
安装到 DSH Desktop
在 DSH Desktop 自己的插件页面 添加已构建插件的本地绝对路径,安装并启用 dsh-session-import。需要重启时,完全退出 Desktop 后重新打开。
当前 Harness 的 Desktop 使用独立的 desktop profile,CLI Web 使用 web profile。在 Web 中安装插件,不会自动为 Desktop 安装;公开 CLI 也不能管理 Desktop 保留的 profile。请使用 Desktop 内的插件管理界面。
旧目录名为 codex-import-plugin,旧包名为 dsh-codex-import。迁移后,请在实际使用的 DSH 实例中安装并启用 dsh-session-import,检查旧依赖是否仍指向已经改名的目录。
会话来源设置
点击导入窗口右上角、关闭按钮旁的 齿轮,打开 Codex 来源设置。
- 输入数据目录或其
sessions文件夹路径,点击 添加。 - 根据需要开启或关闭 自动查找常见数据目录。
- 点击 保存设置,返回 Codex 页面后点击 加载会话或 重新加载。
设置立即生效,无需重启。支持 ~/、~\ 和本机绝对路径,例如 ~/.codex、/Volumes/Work/CodexData、D:\CodexData。不存在或暂未挂载的目录也可以保存;扫描结果显示未找到目录或读取失败的原因。移除来源只停止扫描该自定义目录,不删除文件。
自动发现
会话检索取决于 DSH 后端运行的系统用户和环境,与 Codex 应用的安装位置无关。
| 来源 | 检查位置 |
|---|---|
| 基础目录 | DSH 进程继承的 CODEX_HOME;未设置时使用用户主目录下的 .codex |
| 自定义目录 | 设置中保存的 codexHomes |
| 通用自动发现 | 用户主目录下的 .codex、XDG_CONFIG_HOME/codex、XDG_DATA_HOME/codex |
| XDG 未设置时 | 用户主目录下的 .config/codex 和 .local/share/codex |
| macOS 自动发现 | ~/Library/Application Support/Codex |
| Windows 自动发现 | %APPDATA%\Codex 和 %LOCALAPPDATA%\Codex |
只有存在且可读取 sessions 子目录的候选位置才会扫描。指向同一会话目录的软链接只扫描一次,一个来源失败不会阻止其他来源加载。
关闭自动发现后,仍检查基础目录和自定义目录。插件不进行全盘搜索,默认不扫描 archived_sessions。其他进程独有的环境变量、其他系统用户的数据目录和任意自定义位置,需要在设置中手动添加。
保存位置与初始配置
可视化设置默认保存到当前系统用户主目录下的 .dsh/session-import/sources.json,重新打开浮窗或重启 DSH 仍会保留。该默认路径不会随 DSH_HOME 自动改变。
首次使用读取 loader 中的 codexHomes 和 autoDiscover;已有可视化设置时,以保存的文件为准。需要为不同实例分别保存来源设置,可以通过 settingsPath 指定独立文件。
在 profile 的 cordis.patch.yml 中覆盖已启用的条目,例如:
- id: session-import
name: dsh-session-import
config:
autoDiscover: true
codexHomes:
- ~/other-codex
- /Volumes/Work/CodexData/sessions
settingsPath: /absolute/path/session-import-sources.json
按本机系统替换路径,Windows 的自定义目录可写为 D:/CodexData。修改 loader 配置后重启 DSH;更新目录中的会话内容只需重新加载。已安装的 bundle 会插入插件条目,无需再插入第二个同名条目。
格式与限制
Codex 本地日志
读取 Codex rollout JSONL 中可转换的用户消息、助手文本、工具调用和工具结果,转换为 DSH 会话事件,并保留来源会话 ID、创建时间和所选标题。重复导入时使用新 ID。
Codex 转换并非完整运行环境备份:开发者和系统消息不会作为用户对话导入,未支持的事件会被跳过,图片及其他非文本内容不会完整迁移。工作区文件、原应用的工具实现和凭据不随会话导入。
DSH 会话 ZIP
ZIP 根目录必须包含一个 session.jsonl,首行为有效的 DSH 会话头。归档版本必须与当前 DSH 的会话格式版本一致,插件不会自动迁移不兼容版本。
| 项目 | 限制或行为 |
|---|---|
| 单个 ZIP 大小 | 最大 25 MB |
| 解压后的日志 | 最大 64 MB |
| ZIP 文件条目 | 最多 64 个 |
| 逻辑事件 | 最多 500,000 个 |
| 校验 | 校验持久化事件,并按 DSH 会话重放规则检查 |
| 记录类型 | 支持普通事件及文本、推理、工具调用的压缩 chunk 行 |
| 保留信息 | 标题、创建时间、消息、工具记录、已有模式及继承前缀 |
| 外部资源 | 归档未包含的工作区文件和其他外部文件不会恢复 |
ZIP 在内存中解析,不解压到磁盘。不安全的归档路径、无效日志、不连续序号及不兼容格式会被拒绝。导入接口仅允许本机访问;浏览器中的 Codex 检索读取 DSH 后端所在电脑的数据目录。
常见问题
侧栏没有“会话导入”?
检查当前实例是否已安装并启用 dsh-session-import,本地插件目录是否存在,以及 lib/client.js 是否已构建。Web 与 Desktop 要分别安装;初次安装或重建后,重启对应服务或应用。旧依赖还指向已改名目录时,也会导致加载失败。
加载不到 Codex 会话?
打开齿轮设置,检查最近一次扫描结果。确认添加的是数据目录或 sessions 文件夹,以及 DSH 用户有读取权限。移动 Codex 应用本身不会移动会话数据;自定义数据目录需要手动添加。
名称或工作区分组与 Codex 不一致?
先重新加载,并确认扫描的是当前使用的数据目录。标题和项目名称依赖 Codex 索引与可用的 SQLite 元数据;索引缺失、数据库格式不受支持或运行时无法读取 SQLite 时,会采用回退名称和路径分组。同名会话不一定是同一个 ID。
为什么重新导入后有两条同名会话?
当前重新导入会创建副本。确认提示中会说明这一行为,不会替换已经保存的历史。
更新插件后,旧导入会话仍提示历史加载或迁移失败?
更新转换逻辑不会重写已经保存的日志。可以使用更新后的插件重新导入原 Codex 会话,或重新选择兼容的 DSH 归档。先确认新会话能够打开,再处理旧记录。
开发
pnpm build
pnpm test
构建包含后端 TypeScript、客户端 TypeScript 和浏览器插件打包。测试涉及来源发现、目录设置、会话去重、目标工作区、ZIP 校验、重复导入和 HTTP 上传;HTTP 测试需要允许监听本机端口。
主要文件:
src/client/:侧栏入口、导入浮窗和来源设置界面。src/catalog.ts、src/discovery.ts:Codex 会话与显示元数据检索。src/import-session.ts:Codex JSONL 转换与保存。src/import-zip.ts、src/chunk-rows.ts:DSH ZIP 解析、记录展开与保存。src/settings.ts:来源设置校验与持久化。src/index.ts:插件服务、导入工具与本机 HTTP 接口。cordis.patch.yml:session-importloader 条目。
插件同时保留独立入口 /session-import,可在本机 Web 服务地址后添加该路径访问。
No comments yet. Be the first to write one.