ZhengQingJing / dsh-session-tree

Listed

Git-like immutable session branching for DeepSeek Harness

mainSession View source

Installation

npx -y @deepseek-ai/dsh plugin --profile web add github:ZhengQingJing/dsh-session-tree

This installation command is an unverified starting point generated from the GitHub repository address.

README

Maintainer-authored documentation snapshot.

View on GitHub ↗
Commit 2c181edSynced Aug 18, 2026

dsh-session-tree

中文 | English

dsh-session-tree 是一个可安装的 DeepSeek Harness(DSH)浏览器端插件。它将 DSH 原生 Session fork 呈现为不可变的对话版本树,并允许用户从任意已加载且已完成的对话轮次创建子分支。

[!IMPORTANT] 非官方社区插件。 本项目由社区独立开发,不隶属于 DeepSeek,也未经 DeepSeek 背书或维护。DSH 与本插件均处于预发布阶段;升级前请审阅变更,并备份重要的 DSH profile 与 Session 数据。

源码仓库:github.com/ZhengQingJing/dsh-session-tree

当前版本支持:

  • DeepSeek Harness 源码版 0.1.0-rc.5(审计基线 47f9438)。
  • DSH Client 公开 API 0.1.0-rc.50.1.0-rc.6
  • Node.js ^22.19.0 || >=24.0.0

DSH 尚处于开发者预览阶段。为避免在未来 API 变更上作出不安全的假设,本插件的 peer dependency 仅允许上述两个已验证的预发布版本。

功能

  • 在对话页面中新增 版本树 / Branches 标签页。
  • SessionSummary.parentId 投影为确定性的当前对话家族树。
  • 区分普通 fork 与 subagent 谱系。
  • 显示但隔离孤儿节点和循环谱系,不修改持久化记录。
  • 列出当前已加载历史窗口中的已完成轮次。
  • 调用 DSH 原生 ctx.sessions.fork({ sessionId, atSeq }) 创建子 Session,然后打开新对话。
  • 按需加载更早的历史轮次。
  • 限制大型版本树和长对话的初始 DOM 工作量。

插件不定义自有 SessionEvent 类型,也不维护独立的分支数据库。卸载插件后,已创建的分支仍是普通、可读的 DSH Session。

安全契约

  • 回溯始终创建新的子 Session;绝不截断或重写父 Session。
  • 只提供已完成的 turn/end 检查点。
  • 当 fork 请求进行中时,当前视图中的其他 fork 按钮全部禁用。
  • 不自动重试不确定或部分成功的请求。界面会要求用户先检查版本树,以避免生成重复子分支。
  • 禁用 increaseTitle,避免子 Session 已发布后又因标题修改失败而产生额外的部分成功状态。
  • 谱系异常在 UI 中 fail-soft,不会被静默修复。
  • 对话分支不会撤销文件修改、命令、Git 状态、进程、网络请求、邮件、支付或其他工具副作用。
  • 不合并不同分支的上下文,也不重放工具调用。

安装

以下命令安装到 DSH 的 web profile。dsh plugin 会把包管理参数转发给 pnpm,因此需要先确保 dsh 和 pnpm 都在 PATH 中。

从 npm 安装(推荐)

npm 包是预编译制品,安装时不需要授权本地构建脚本。0.1.0-beta.2 起由 GitHub Actions Trusted Publisher 使用短期 OIDC 凭据发布,不在仓库中保存 npm token,并自动生成 provenance。

安装 next 渠道中的最新预发布版本:

dsh plugin --profile web add dsh-session-tree@next

如需固定本次发布版本:

dsh plugin --profile web add dsh-session-tree@0.1.0-beta.2

从 GitHub 安装

固定到已审阅的 release tag;更严格的供应链要求下,请将 tag 换成已核验的完整 commit SHA:

dsh plugin --profile web add github:ZhengQingJing/dsh-session-tree#v0.1.0-beta.2

Git 安装会以当前用户权限、在 agent sandbox 之外执行仓库的 prepare 构建脚本。请在授权前审阅 tag/commit、package.json、锁文件和 prepare 脚本。pnpm 10 及以上版本默认会拦截这类依赖构建;首次 add 可能按预期失败,并打印 allowBuilds 键及实际 profile 中 pnpm-workspace.yaml 的路径。只把 pnpm 输出的精确包键加入该文件的 allowBuilds,然后重跑同一条命令;不要开启全局允许所有构建脚本的选项。预编译的 npm 包或 release tarball 不需要这项授权。

从 GitHub Release tarball 安装

Releases 下载 dsh-session-tree-0.1.0-beta.2.tgz,先对照该 release 提供的校验值,再执行:

dsh plugin --profile web add ./dsh-session-tree-0.1.0-beta.2.tgz

也可以自行构建预编译 tarball。本项目使用 pnpm 11.7.0

git clone https://github.com/ZhengQingJing/dsh-session-tree.git
cd dsh-session-tree
pnpm install --frozen-lockfile
pnpm run verify
pnpm pack

随后把 pnpm pack 输出的实际 .tgz 路径传给 dsh plugin --profile web add

验证并启动

dsh --profile web --dump-config
dsh --profile web

确认配置中包含 dsh-session-tree。添加、更新或移除插件后,请重启 DSH 并重新加载浏览器页面;当前 DSH 浏览器端静态包 roster 不支持完整的热安装或热卸载。

更新

跟随 npm next 渠道更新:

dsh plugin --profile web update dsh-session-tree@next

如需锁定版本,改用 add dsh-session-tree@<version>。GitHub 安装请把原命令中的 tag/commit 换成已审阅的新版本后重新执行;tarball 安装请下载、校验并 add 新文件。更新后务必重启 DSH。

卸载

dsh plugin --profile web remove dsh-session-tree

随后重启 DSH。卸载只移除插件 UI 和配置层,不会删除已经创建的原生 DSH 子 Session。

使用

  1. 打开一个已有对话。
  2. 在对话视图标签中选择 版本树 / Branches
  3. 在右侧选择一个已完成的轮次。
  4. 选择 从这里创建分支 / Branch from here
  5. DSH 创建并打开新的子 Session,原对话仍可从版本树中访问。

页面只列出当前已加载历史窗口中的轮次。如果目标检查点尚未出现,请选择 加载更早轮次 / Load earlier turns

开发与验证

pnpm run typecheck
pnpm run test
pnpm run build
pnpm run check:bundle
pnpm run pack:check

pnpm run verify 会依次运行类型检查、测试、构建与 bundle 校验。

浏览器产物不是普通的 CommonJS bundle。lib/client.js 会被包装为 DSH module-loader factory,通过冻结的平台模块表共享 React、Cordis 和 UI 模块实例。CSS Modules 会被编译并带有插件归属标记,因此 DSH 可以随插件 fiber 移除样式。

当前实现已经过以下验证:

  • 插件单元与交互测试:13/13 通过。
  • DSH 原生 fork 定向回归测试:21/21 通过。
  • 隔离 DSH profile 中的安装、加载、创建分支和打开子 Session 浏览器端到端验收。

已知限制

  • 上游 fork RPC 没有调用方 operation id、持久化源见证或幂等重试契约。多个页面或进程仍可能创建重复子 Session;本插件只防止同一个已挂载视图内的重复操作。
  • Host workspace attach 失败时,子 Session 可能已发布,但客户端 Promise 仍会 reject。公开 runtime 无法稳定暴露该子 Session ID,所以插件只报告“结果不确定”,不会重试。
  • Session summary 包含 parent id,但不包含 seedLength 或解析后的 fork 边界,因此版本树无法低成本地在子边上标注精确源 seq。
  • 尚不支持命名 ref、HEAD、reflog、merge、rebase、cherry-pick、分支删除、共享前缀存储或自动产物 GC。
  • 每个原生子 Session 都会实体化其继承的事件前缀;大量长寿命分支会放大存储用量。
  • 正在生成的 assistant chunk 不是已完成的模型上下文,不会被提供为检查点。
  • 界面不会向 Trajectory 行或 conversation.chat.turnTail 链插入操作,因为这会替换 Produced Files 等其他 chain contributor。
  • Workspace 快照和外部副作用回滚明确不在当前范围内。

贡献者

生产级事务设计与强化计划详见 ./docs/DSH_SESSION_TREE_DESIGN.md

Project files and signals

Shown items are public repository signals detected in the directory snapshot.

TestsDetected
Security policyDetected
Contributing guideDetected
DocumentationDetected

Repository information

Language
TypeScript
License
MIT
Last updated
Aug 14, 2026, 10:22 AM

Install deliberately

Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.