DSH Plugins Marketplace

DSH Plugins

Plugins

/

Development & Infrastructure

/

dsh-codex-history

c

dsh-codex-history

Manifest valid★ 2

DSH Plugin: Automatically reads local Codex session history, seamlessly bridging DeepSeek Harness with Codex

UI (client)hasBundlePatch

dsh-codex-history

让 DeepSeek Harness(DSH)与本地 Codex CLI 的聊天记录无缝衔接。 插件会自动读取 ~/.codex/sessions 里的 Codex 会话记录,把它交给 DSH 的模型继续干活; 当 Codex 那边有了新进展,会自动同步回当前对话。

DSH license node market

English README: README.en.md

📌 上架状态:已向 awesome-dsh-plugin(DSH 插件市场的精选列表)提交收录 PR #9052。仓库创建满 1 天后该检查会自动转绿并合入, 之后就能在 awesome-dsh-plugin.com 和 dsh-market 里搜到本插件。


1. 它解决什么问题

你在 Codex CLI(或 Codex Desktop)里聊了一上午,积累了一批对话;换到 DSH 时,这些上下文不会自动跟过来。 dsh-codex-history 把 Codex 的本地会话记录变成 DSH 的一等公民:

能力说明
自动读取后台轮询 ~/.codex/sessions/**/rollout-*.jsonl,文件一有变化就重新索引(默认 5 秒),不需要手动刷新
模型可用注册 codex_history 工具:模型可以自己列出、检索、读取历史会话,不会凭空猜测 Codex 里聊过什么
用户可用注册 /codex 斜杠命令,以及 Web 面板里输入框下方的 「Codex 历史」 入口
一键交接把某个 Codex 会话整段导入当前 DSH 对话继续工作,或把内容填进输入框
自动带入新建会话时,若当前工作目录在 Codex 里聊过,自动把那次会话作为上下文带进来
实时回灌导入过的会话在 Codex 侧出现新消息时,增量同步回同一个 DSH 对话(不会自己触发一轮回答)
工作要点worklog 动作把长会话压缩成「用户要什么 / 助手做了什么 / 跑了哪些命令 / 动了哪些文件 / 哪里失败了」
跨机共享可选的共享目录:台式机与工位笔记本用 Syncthing / OneDrive / 网盘同步同一份目录,两边互相能看到对方的 Codex 与 DSH 会话

插件零运行时依赖(只用 Node 内置模块),只读 ~/.codex,不会改写 Codex 的任何文件。


2. 界面

Web 端在输入框下方多出一枚与其他下栏完全同款的小胶囊按钮「Codex 历史」(与 activity、usage 同字号、同色系)。 点击后弹出面板:

本地 Codex 会话                                    关闭
[ 搜索标题或工作目录            ] [刷新]
[ 起始日期 ] [ 截止日期 ]
目录: C:\Users\you\.codex\sessions

昨天写的周报脚本 · D:\work\report
2026-10-23 00:22 · 21 条消息 · 3 次工具调用 · D:\skills
[导入对话] [填入输入框] [工作要点]
  • 导入对话:把整段会话作为上下文注入当前 DSH 对话,模型接着往下做。
  • 填入输入框:把会话内容写进输入框,你自己决定怎么问。
  • 工作要点:展开结构化摘要(做了什么、动了哪些文件、哪里失败)。

面板里的会话来自本机 Codex 目录;开启共享目录后,其他机器的会话也会出现在同一列表里,并标注来源机器。


3. 环境要求与版本兼容

项目要求
DSH≥ 0.2.0(本插件在 0.2.1-rc.2 上开发并验证;package.json 里声明 engines.dsh: ">=0.2.0")
运行时Node.js ≥ 20(随 DSH 桌面版一起分发,无需另装)
操作系统Windows / macOS / Linux(路径全部走 path API,跨平台)
依赖零运行时依赖,只用 Node 内置模块
Codex需要 Codex CLI / Codex Desktop 写过会话,即 ~/.codex/sessions 下有 rollout-*.jsonl

DSH 版本低于 0.2.0 时,插件管理器会以 incompatible-version 拒绝安装,并给出 engines.dsh 未满足的记录。


4. 安装

只有三种装法,任选其一。

4.1 方式一:AI 部署(推荐)

打开 DSH,直接跟它说一句话就行。 把下面这句原样发给 DSH 里的 agent:

帮我安装 dsh-codex-history 插件,地址是 github:chameleonn4/dsh-codex-history

agent 会自己完成整套流程:

  1. 调用插件管理器的 install_bundle,先 git ls-remote 确认仓库可达;
  2. 执行 pnpm add,把插件作为 bundle 装进当前 profile,并自动写入 cordis.patch.yml 的插入行;
  3. 校验 engines.dsh(本插件要求 DSH ≥ 0.2.0),不满足会回滚并说明原因;
  4. 提示你重启 DSH。

重启后输入框下方就出现「Codex 历史」。

想连配置一起让 agent 写好,就把需求一起说,例如:

帮我安装 dsh-codex-history 插件(github:chameleonn4/dsh-codex-history),
并把 sessionsDir 设成 C:\Users\me\.codex\sessions,
同时打开跨机共享目录,目录用 D:\CodexShare。

agent 的安装动作需要 danger-full-access 权限;在受限权限下它会提示你授权,或改用方式三手动安装。

4.2 方式二:插件市场(dsh-market)

  1. 打开 dsh-market 插件市场;
  2. 搜索 dsh-codex-history(或「Codex 历史」「Codex」);
  3. 点安装,按提示重启 DSH。

市场里的插件列表来自精选列表 awesome-dsh-plugin, 本插件的收录 PR 是 #9052; 合并后就会出现在市场里。国内网络下市场会自动切换到 npm 镜像。

收录合并前,先用方式一或方式三装。

4.3 方式三:插件管理器

  1. 打开 DSH → 插件 页面(侧边栏的插件管理页)→ 添加插件;

  2. 填入安装地址,三种写法任选其一:

    github:chameleonn4/dsh-codex-history
    https://github.com/chameleonn4/dsh-codex-history.git
    chameleonn4/dsh-codex-history
    
  3. 确认安装。插件管理器会执行 git ls-remote + pnpm add,把插件作为 bundle 装进当前 profile, 并自动写入 cordis.patch.yml 的插入行;

  4. 重启 DSH,输入框下方就会出现「Codex 历史」。

从 GitHub 安装时,版本兼容性(engines.dsh)在拉取之后校验;不满足时会回滚 profile 清单, 并给出 incompatible-version 记录(本插件要求 DSH ≥ 0.2.0)。

4.4 工位笔记本部署清单

在一台新机器上装好这套插件,只要按下面的顺序走一遍:

#步骤说明
1确认 DSH 版本 ≥ 0.2.0插件页 → 关于 / dsh --version
2在这台机器上正常使用 Codex 一次需要 ~/.codex/sessions 下有 rollout-*.jsonl,否则没有历史可读
3让 DSH 装它:说一句「帮我安装 dsh-codex-history 插件」见 4.1;也可以走市场或插件管理器
4重启 DSH输入框下方出现「Codex 历史」即安装成功
5(可选)配置 ~/.dsh/profiles/<profile>/cordis.patch.yml见第 5 节;不配就用默认值
6(可选)两台机器共享同一份被同步的目录见第 7 节,配置 share.enabled: true
7验证打开面板应能看到本机 Codex 会话;或 GET /api/codex-history/status 返回 sessionCount > 0

换机器时不需要迁移任何配置或数据:会话记录留在各自的 ~/.codex/sessions, 插件只读。想让两台机器互相看到对方的会话,用第 7 节的共享目录方案。


5. 配置

5.1 写在哪儿

插件配置来自 profile 的 patch 层:~/.dsh/profiles/<profile>/cordis.patch.yml。 用补丁行的 id 指向插件(id: codex-history)即可覆盖配置。

⚠️ config 是整体替换而不是深度合并,请把要保留的字段一起写上。

# ~/.dsh/profiles/desktop/cordis.patch.yml
- id: codex-history
  config:
    sessionsDir: 'C:\Users\you\.codex\sessions'
    indexPath: 'C:\Users\you\.codex\session_index.jsonl'
    pollIntervalMs: 5000
    maxListResults: 50
    maxTranscriptChars: 20000
    maxImportChars: 12000
    autoImport:
      enabled: true
      matchCwd: true
      maxChars: 6000
      maxMessages: 40
    liveSync:
      enabled: true
      maxChars: 6000
    share:
      enabled: false
      dir: 'C:\Users\you\CodexShare'
      machineId: 'desktop'
      label: '台式机'
      mirrorCodex: true
      mirrorDsh: true
      intervalMs: 30000
      discoverIntervalMs: 15000

改完保存后重启 DSH(或重新启用该插件)即可生效。

5.2 配置项

键默认值说明
sessionsDir~/.codex/sessionsCodex 会话目录
indexPath~/.codex/session_index.jsonlCodex 会话标题索引
pollIntervalMs5000目录轮询间隔(毫秒),决定「自动读取」的延迟
maxListResults50列表类接口最多返回多少条
maxTranscriptChars20000单次读取的转录长度上限(字符)
maxImportChars12000导入当前对话的上下文字符上限
autoImport.enabledtrue新会话是否自动带入同目录的 Codex 上下文
autoImport.matchCwdtrue自动带入时是否按工作目录匹配
autoImport.maxChars6000自动带入的字符上限
autoImport.maxMessages40自动带入的最大消息条数(取最近 N 条)
liveSync.enabledtrue是否把 Codex 侧的新消息增量同步回已导入的对话
liveSync.maxChars6000单次增量同步的字符上限
share.enabledfalse是否启用跨机共享目录
share.dir~/CodexShare共享目录(两台机器指向同一份同步目录即可)
share.machineId主机名本机标识(用于隔离各机器写入的子目录)
share.label同 machineId展示用的机器名(列表里显示「来源机器」)
share.mirrorCodextrue是否把本机 Codex 记录写进共享目录
share.mirrorDshtrue是否把本机 DSH 会话日志写进共享目录
share.intervalMs30000镜像写入间隔
share.discoverIntervalMs15000发现其他机器目录的间隔

6. 使用

6.1 模型工具:codex_history

模型在需要时自动调用,也可以由你直接要求:「看看我之前在 Codex 里改的那个周报脚本」。

动作参数说明
listlimit, since, until列出最近的 Codex 会话
readsession_id读取某个会话的完整转录
searchquery, limit全文检索所有消息
latestcwd, since, until找到某个工作目录最近的那次会话
worklogsession_id 或 cwd + since/until生成工作要点摘要

时间参数 since / until 支持 YYYY-MM-DD 或 ISO 8601 时间;只写日期时按**整天(UTC)**处理。 会话按「区间重叠」筛选——会话开始于区间之前但区间内仍在更新,也会被算进来。

6.2 模型工具:dsh_history

开启共享目录后可用,用来读其他机器的 DSH 对话:list / read / search。

6.3 斜杠命令

/codex                          列出最近的 Codex 会话
/codex list                     同上
/codex search <关键词>          全文检索
/codex worklog [起始] [结束]    时间窗口内的工作要点
/codex <会话 id> [消息条数]     把该会话导入当前对话
/dsh                            列出其他机器共享过来的 DSH 会话
/dsh search <关键词>            检索那些会话

6.4 Web 面板

输入框下方的「Codex 历史」→ 搜索 / 按日期过滤 / 导入对话 / 填入输入框 / 查看工作要点。

6.5 自动带入与实时回灌

  • 自动带入:新建 DSH 会话时,若当前工作目录在 Codex 里有记录,插件会把最近那次会话作为上下文注入。 (只对根会话生效,子代理不会被重复注入。)
  • 实时回灌:某个 Codex 会话已被导入到某个 DSH 会话后,Codex 侧新增的消息会以「增量」形式注入同一个对话。 注入用的是 inject(排进下一次 step),不会自己触发一轮模型回答。

7. 跨机共享目录(台式机 ↔ 工位笔记本)

给两台机器准备一个会被同步的目录(Syncthing、OneDrive、坚果云、网盘都行),两边都指向同一个路径,然后:

- id: codex-history
  config:
    share:
      enabled: true
      dir: 'D:\CodexShare'      # 两台机器指向同一个被同步的目录
      machineId: 'desktop'       # 这台改成 'laptop'
      label: '台式机'            # 这台改成 '笔记本'

目录结构(每台机器只写自己的子树,所以同步工具永远不需要合并两个写入方):

<共享目录>/
  machines/<machineId>.json        机器描述(名称、主机名、系统)
  codex/<machineId>/sessions/…     该机器的 Codex 会话文件
  codex/<machineId>/session_index.jsonl
  dsh/<machineId>/sessions/…       该机器的 DSH 会话日志

开启后:

  • 列表里会同时出现本机和其他机器的 Codex 会话,并标注来源;
  • /dsh 与 dsh_history 工具可以读其他机器的 DSH 对话。

8. HTTP API

所有接口挂在 /api/codex-history 下,并复用 DSH 自带的登录 / 同源校验(未登录返回 401,跨站或不可信请求返回 403)。

方法路径说明
GET/api/codex-history/status插件状态、版本、目录、会话数、共享目录概况
GET/api/codex-history/sessions会话列表,支持 query / cwd / since / until / limit
GET/api/codex-history/session?id=单个会话的完整转录
GET/api/codex-history/worklog工作要点,支持 id / cwd / since / until / limit
POST/api/codex-history/import导入会话:{"id": "<会话 id>", "targetSessionId": "<DSH 会话 id>"}
GET/api/codex-history/dsh-sessions其他机器共享来的 DSH 会话列表
GET/api/codex-history/dsh-session?id=其他机器的 DSH 会话转录

9. Codex 会话记录是怎么被解析的

Codex 把每次对话写成一个 JSONL 文件:

~/.codex/sessions/2026/10/22/rollout-2026-10-22T23-12-43-<uuid>.jsonl

每行是一条 {"timestamp":…,"type":…,"payload":…} 记录,插件主要用到的类型:

记录用途
session_meta会话 id、工作目录、CLI 版本、模型提供方
response_item / message用户与助手的正文(role 为 user / assistant)
event_msg / item_completed补充消息(UserMessage / AgentMessage)
event_msg / task_complete最后一轮回答(兜底)
response_item / custom_tool_call、function_call工具调用与命令,用来生成工作要点
turn_context每轮的模型与沙箱设置

清洗规则(把 Codex 的内部包装还原成人话):

  • 丢弃每轮开头的 <environment_context> 块(cwd、shell、日期等环境信息);
  • <send_user_message_question_reply> 展开成「问 / 答」列表;
  • # Files mentioned by the user: + ## My request: 拆成「提到的文件」和「请求」;
  • # Response annotations: 展开成批注列表;
  • 去掉 :codex-annotation{index="N"} 这类界面标记。

会话标题取自 ~/.codex/session_index.jsonl(thread_name),取不到时退回首条用户消息的摘要。

DSH 侧的会话日志是 session.v4.jsonl.zstd(多帧 zstd 容器),插件会自己定位帧边界再逐帧解压,因此跨机共享时也能读出对方的 DSH 对话。


10. 源码结构

dsh-codex-history/
├── index.js                 Host 侧入口:注册工具、命令、HTTP 路由、后台同步
├── lib/
│   ├── parse.js             Codex rollout JSONL 解析与清洗
│   ├── store.js             会话索引、时间窗口、增量刷新
│   ├── format.js            转录 / 导入 / 增量 / 工作要点的文本渲染
│   ├── share.js             跨机共享目录:镜像、发现、机器描述
│   ├── dshstore.js          共享目录里其他机器的 DSH 会话索引
│   └── dshlog.js            DSH 会话日志(多帧 zstd)解码
├── client/
│   └── client.js            Web 端面板(React,走 conversation.composer.dock 插槽)
├── locale/
│   ├── zh.json              插件管理器里显示的名称与描述
│   └── en.json
├── cordis.patch.yml         bundle 补丁:把插件插入组合
├── icon.svg
├── test/                    自测脚本(见下)
└── tools/asar.js            开发辅助:读取 app.asar(仅开发用)

11. 开发与测试

11.1 从源码开发

git clone https://github.com/chameleonn4/dsh-codex-history.git
cd dsh-codex-history

在 profile 目录下执行 pnpm add link:D:/path/to/dsh-codex-history 建立链接后, 改完代码在插件管理器里重新启用一次 codex-history(或 dsh plugin ... set_plugin include:codex-history enabled=true), Host 侧代码会热重载;Client 侧刷新一次页面即可。

11.2 测试

# 语法检查
node --check index.js && node --check client/client.js

# 解析器与工作要点的断言
node test/parse-check.mjs

# 用假 ctx 跑通 Host 侧:工具、命令、路由、agent/created 钩子
node test/plugin-mock.mjs

# 端到端增量同步:写一个临时 rollout → 触发自动导入 → 追加消息 → 验证增量注入
node test/live-sync.mjs

# 直接解析真实的 ~/.codex/sessions,输出转录与工作要点
node test/host-smoke.mjs

# 跨机共享全链路自测:造两台假机器,验证镜像、发现、读取与检索
node test/share-check.mjs

# 对着运行中的 DSH 打一次真实 HTTP 请求(需要登录态)
node test/http-check.mjs

test/ 里的脚本不依赖 DSH 运行时(只有 http-check.mjs 需要一个正在运行的实例与登录 Cookie),可以直接在 CI 上跑。


12. 常见问题

Q:面板里什么都没有? A:确认 ~/.codex/sessions 下确实有 rollout-*.jsonl(用 Codex CLI 聊过一次即可)。 也可以打开 GET /api/codex-history/status 看 available 与 sessionCount。

Q:模型好像不知道 Codex 里聊过什么? A:模型需要主动调用 codex_history 工具。插件已经在系统提示里告诉它这个工具的存在; 你也可以直接说「用 codex_history 搜一下 …」。

Q:自动带入没有触发? A:自动带入要求 (1) autoImport.enabled 为真;(2) 会话是根会话;(3) Codex 会话的 cwd 与当前会话工作目录一致。

Q:改动代码后 Host 没生效? A:链接安装(link:)的情况下,改完文件需要在插件管理器里重新启用一次插件,Host 侧才会热重载。

Q:Windows 上路径反斜杠要注意什么? A:sessionsDir、share.dir 等路径建议写成 'C:\Users\you\.codex\sessions'(YAML 单引号里反斜杠无需转义)。


13. License

MIT © chameleonn4

Comments

Loading…

From the same category

awesome-dsh-plugin

by awesome-dsh-plugin

A curated list of plugins for DeepSeek Harness (dsh) · DeepSeek Harness 插件精选列表

Development & Infrastructure

★ 20.5k

CC0-1.0

Python

Oct 25, 2026

Index only — not installable

by 0xsline

DeepSeek Harness (DSH) ecosystem: curated plugins, tools, and infrastructure from dsh-external/hub and the public dsh-plugin topic.

Development & Infrastructure

★ 1.3k

CC0-1.0

Python

Oct 16, 2026

Index only — not installable

by pax-beehive

Open-source CLI, schemas, resolver, and DSH agent tools for DSH Plugin Hub

Development & Infrastructure

★ 277

MIT

TypeScript

Oct 20, 2026

Index only — not installable

by xiajiajun516

DeepSeek Harness (DSH) backup & restore plugin — export, import, migrate and sync your complete DSH configuration, plugins, MCP servers, skills and workspace. One-click migration to another machine.

Development & InfrastructureManifest valid

★ 240

MIT

TypeScript

Oct 24, 2026

dsh plugin --profile web add dsh-config-manager

by yjh051108

推荐组件(非必须):DeepSeek Harness 运行时注入器;已随 dsh-routing-suite 单仓库化保留,本仓库继续维护/发布。

Development & InfrastructureManifest valid

★ 167

TypeScript

Oct 16, 2026

dsh plugin --profile web add @dsh-external/dsh-super-injector

by Yuuyuko-uu

DSH 鱼的记忆:给会话一份会淡忘的长期记忆,每条都带时间

Development & InfrastructureMemory & ContextSessions & MessagesManifest valid

★ 135

MIT

JavaScript

Oct 24, 2026

dsh plugin --profile web add dsh-fish-memory