@dsh-plugin/dsh-session-tree 为 DSH 官方聊天增加消息分支,并保存当前激活路径的标准会话日志。宿主端使用 TypeScript,客户端使用 TSX。
- 用户消息支持原位编辑。取消保留原消息;发送建立同级分支并立即生成回复。
- 助手消息支持重试,新回复与原回复拥有相同父节点。
- 同级消息有多个版本时显示
‹ 2 / 2 ›。用户版本控件位于消息下方右侧,与复制、编辑、撤回同排;回答版本控件位于助手底部操作行左侧。切换时恢复该分支此前选择的后代。 - 已送入模型的用户消息软撤回到父节点,保留原节点及后代;下一条消息建立同级分支。
- 待发送消息硬撤回会移除队列或拦截尚未派发的请求,并恢复文本和附件到输入框。
- 当前轮次运行期间禁用分支修改、编辑和重试。等待轮次完成,或手动停止并完成收尾后再操作。待发消息可硬撤回。
本插件需要 @dsh-plugin/dsh-loader@^2.0.0-dev.43473963317,其中包含会话扩展和分支轮次标题接口。开发依赖固定为 2.0.0-dev.43473963317,使用 Node.js 24 与 pnpm 11.17.0。构建使用 pnpm install --frozen-lockfile、pnpm run typecheck、pnpm run build,算法测试使用 pnpm test。
当前兼容 DSH 0.2.2-rc.1 和 0.2.2-rc.2,已在独立测试实例验证。安装后需要重启目标宿主,使 loader 从会话创建时捕获生命周期;缺少句柄的旧活动会话会明确拒绝改写。
默认树数据目录为 ${DSH_HOME}/data/dsh-session-tree/sessions/,未设置 DSH_HOME 时使用 ~/.dsh。文件名使用会话 ID 的 SHA-256,避免会话身份被解释为路径。
.json保存完整树、激活游标、同步摘要和幂等操作记录。.original.json保存首次接管的官方日志快照。.transaction.json保存历史替换事务及其阶段。
官方 sessions 继续保存当前激活路径,使用官方格式编解码器并保留原压缩格式。插件通过 Agent 生命周期和官方写锁协调历史替换,然后重建同一会话的上下文。其他分支仅保存在插件独立目录。
备份时同时备份树目录、官方 sessions 和附件目录。不要在宿主运行时手工修改这些文件。无法唯一判定中断事务所属版本时,插件拒绝继续改写并报告冲突。
原位编辑保留原附件,也支持添加和移除附件。发送失败保留编辑内容。硬撤回恢复会合并已有普通文本草稿和附件;输入框包含引用或命令时保留待恢复草稿,先处理当前输入后再恢复。
分支切换改变模型上下文,不撤销历史工具调用已产生的文件修改或外部操作。重试截断的旧轮次如果仍含处理内容,会显示为“分支前的处理记录”,保留展开查看入口;空的截断轮次不显示完成提示。停用插件后官方系统仍可读取最后导出的激活路径,其他分支需要重新启用插件访问。
工作流 .github/workflows/npm-publish.yml 参考 dsh-auxiliary,在 Linux、Windows、macOS 上执行锁定依赖安装、类型检查、构建、算法测试与包内容检查。PR 和手动运行只执行检查。
- 推送
main:将稳定基础版本X.Y.Z转为X.Y.Z-dev.<GitHub run ID>,发布到next。 - 推送
vX.Y.Z标签:要求标签与package.json版本完全一致,发布到latest。 - 已存在的版本跳过重复发布;注册表查询出现非 404 错误时立即失败。
- 正式版发布成功后,
scripts/dump-npm-latest.mjs读取 npm 的精确版本、发布时间、tarball 和 integrity,回写npm-latest.json并提交到main;数据未变化时不提交。
首次发布前,在 npm 为此仓库的 npm-publish.yml 配置 Trusted Publisher,或在 GitHub 配置有目标包发布权限的 NPM_TOKEN。发布任务授予 id-token: write;元数据回写任务使用 GITHUB_TOKEN 的 contents: write,仓库分支保护需允许该机器人提交。未配置 npm 认证或分支保护拒绝回写时,对应任务会报错。