前言¶
在 DSH 里跑完一段长对话后,常见需求有两类:把当前会话 id 贴给别人或脚本;换到本机 codex CLI,用 codex resume <id> 接着干。只复制 DSH 的会话 id 对 codex 没有用处——codex 的 resume 只认自己会话库里的记录。手工对照日志、拼 rollout 和索引既慢又容易写错 schema。
下面介绍社区插件 @uu88s/dsh-session-handoff(维护者 uu88s,SkillHub 分类「记忆」):在 Web 侧提供复制 id 与「交接给 codex」入口,把源会话展平后写入 codex 可恢复的原生记录,并给出 codex resume <新 id>。
这是什么¶
DSH Web 插件,做两件事:
- 复制会话 id:侧边栏会话行 hover 图标或
…菜单里一键复制 DSH 会话 id。 - 交接给 codex:读取整个 DSH 会话(对话文本、工具调用、工具输出、文件变更清单),转写成 codex 能
resume的会话,写入 codex 会话库并登记索引,最后给出可粘贴的恢复命令。
交接链路在 README 里概括为:读源会话 → 展平成中间表示 → 写成目标 agent 的原生记录 → 登记进目标索引 → 给出恢复凭据。v1 只实现 codex;反方向(外部会话导入 DSH)由官方 dsh-chat-import 负责,本插件不重复实现。
源码与问题反馈:https://github.com/uu88s/dsh-session-handoff;目录页:https://www.skillhub.cn/plugins/uu88s/dsh-session-handoff。
核心功能¶
界面与命令入口¶
| 入口 | 位置 | 作用 |
|---|---|---|
| 会话行 hover 图标 | 侧边栏会话行右侧 | 交接给 codex |
会话行 … 菜单 |
同上 | ① 复制 DSH 会话 id ② 交接给 codex |
| 会话头部「交接」按钮 | 会话标题右侧 | 交接给 codex |
/handoff 命令 |
输入框 | [<sessionId>] [--dry-run] [--undo [--force]] |
handoff_session 工具 |
模型可调用 | {sessionId?, dryRun?, codexHome?} |
交接采用两步式:先预演(列出将新建的 rollout 文件与将插入的索引行),确认后才写入。完成后 Toast 提供复制恢复命令、撤销这次交接、关闭。
写入内容与保真度(v1)¶
| 内容 | 是否转写 |
|---|---|
| 用户 / 助手对话文本 | ✅(模型上下文 + 界面转录两条通道) |
| codex 界面里显示的历史 | ✅ 用户 / 助手消息;工具活动不进界面 |
| 工具调用(名称 + 参数,参数超 2 KB 截断并标注) | ✅ |
| 工具输出(单条超 8 KB 截断,标注原 DSH 会话 id) | ✅ |
| 文件变更清单(从工具参数里抽取的路径) | ✅ |
| reasoning / 思考过程 | ❌ |
| 附件图片、系统提示快照 | ❌(附件仅以绝对路径占位一行) |
交接会话的 cwd 默认等于源会话的 cwd;originator 为 dsh-session-handoff,cli_version 为 0.1.0-dsh-handoff。
快照语义¶
交接在写入那一刻固化源会话内容;之后 DSH 源会话继续变长,codex 目标线程不会自动同步。要带上新内容需重新交接,每次生成新的目标会话 id,不覆盖旧目标(README 实测:同一源会话在不同时刻交接,目标 id 与写入规模不同,后一次才包含第一次之后的新消息)。
安全与可撤销¶
- 只增不改:不覆盖已有 rollout 文件(
flag: 'wx'),不改写索引已有行。 - 预检:校验 codex 家目录、
state_*.sqlite、threads表与 schema 版本等;失败直接报错。 - 可撤销:删除本次 rollout 与对应
threads行;记录追加到$DSH_HOME/session-handoff/handoffs.jsonl。
安装与启用¶
插件以当前 DSH 进程权限运行,安装前建议浏览仓库源码与 MIT 许可证。要求 DSH >=0.1.5-rc.1、Node >=22(见 package.json)。
README 提供多种安装方式,任选其一:
# 跟随 main
dsh plugin --profile web add github:uu88s/dsh-session-handoff
# 锁定版本标签
dsh plugin --profile web add github:uu88s/dsh-session-handoff#v0.1.0
# 源码归档
dsh plugin --profile web add https://codeload.github.com/uu88s/dsh-session-handoff/tar.gz/refs/tags/v0.1.0
# Release 资产
dsh plugin --profile web add https://github.com/uu88s/dsh-session-handoff/releases/download/v0.1.0/uu88s-dsh-session-handoff-0.1.0.tgz
下载解压后本地安装示例:
curl -L -o handoff.tar.gz https://codeload.github.com/uu88s/dsh-session-handoff/tar.gz/refs/tags/v0.1.0
tar -xzf handoff.tar.gz
dsh plugin --profile web add /绝对路径/到/dsh-session-handoff-0.1.0
装完后在 dsh --profile web --dump-config 的组合树中应能看到 - id: session-handoff / name: '@uu88s/dsh-session-handoff'。client 半边改动可依赖 dsh-client-hmr 免刷新生效;host 半边改 JS 需重启 DSH。
典型用法¶
- 在 Web 侧边栏打开要迁移的会话,用 hover 图标、
…菜单或会话头「交接」发起交接;或在输入框执行/handoff(可加--dry-run仅预演)。 - 在预演结果里确认将写入的 rollout 与索引行,确认写入。
- 在 Toast 点击复制,得到类似下面的命令(
<新 id>为插件生成的 codex 线程 id):
codex resume <新 id>
仅复制 DSH id 时,用会话行 … 菜单中的复制项即可,无需交接。
模型侧也可调用 handoff_session,参数 {sessionId?, dryRun?, codexHome?}。
适用场景与注意¶
适合:已在 DSH Web 里积累长会话,需要在同一 cwd 下用 codex CLI 继续;需要把对话、工具轨迹和变更路径一并带进 codex 模型上下文,而不是只记一个 DSH id。
注意:
- 目标侧须存在可用的 codex 状态库;codex 正在占用库时可能遇到
SQLITE_BUSY(插件预检会探测)。 - 界面转录不还原工具条目与 reasoning,避免与 codex
TurnItem形状不一致导致resume崩溃;工具信息留在模型上下文通道。 - 升级 codex 后应用仓库内
test/probe-schema.mjs、test/probe-transcript.mjs复核(README 测试说明);zcode、codebuddy 等适配属于 v2 规划。 - 撤销不动 DSH 源会话,也不改
~/.codex/session_index.jsonl(非 resume 入口)。
DeepSeek Harness 社区插件目录在 SkillHub,与 DeepSeek / 幻方无官方从属关系;安装与交接行为以你本机 DSH 与 codex 环境为准。
结尾¶
@uu88s/dsh-session-handoff 把「复制 DSH 会话 id」和「写成 codex 可 resume 的完整会话」拆开做成明确入口,并用预演、只增不改与可撤销降低误写 codex 库的风险。需要插件详情与安装入口见 SkillHub 目录页;实现与限制以 GitHub 仓库 README 为准。