@uu88s/dsh-session-handoff:把 DSH 会话复制 id 或交接给 codex resume

前言

在 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 插件,做两件事:

  1. 复制会话 id:侧边栏会话行 hover 图标或 … 菜单里一键复制 DSH 会话 id。
  2. 交接给 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。

典型用法

  1. 在 Web 侧边栏打开要迁移的会话,用 hover 图标、… 菜单或会话头「交接」发起交接;或在输入框执行 /handoff(可加 --dry-run 仅预演)。
  2. 在预演结果里确认将写入的 rollout 与索引行,确认写入。
  3. 在 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 为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜