dsh-fork-relink
DSH(DeepSeek Harness)官方 fork 的伴随插件:fork(分支)发生后,自动为原会话的直接子 agent 创建完整副本挂到新会话下——fork 出的对话完整保留子 agent 面板、代理路由、descriptor、label 等信息;原会话的子 agent 记录原样保留(复制而非转移,两个分支互不干扰)。
本插件由 Enosensu 与 AI(ZCode 智能体,GLM 模型)结对开发 · Co-developed with AI.
背景
DSH 的 fork(会话列表里的分支按钮)用新会话 id 承接被继承的历史,而子 agent 会话按 parentSession 挂在父会话下。fork 之后,子 agent 记录仍指向旧会话——新对话的子 agent 面板为空,子 agent 的全部工作记录"消失"(实际仍在磁盘上,只是脱离了新对话)。
原理
监听官方 session/created 事件。fork 子会话(isSeeded 且有 parentSession 且 origin !== 'subagent')进入 store 时,为旧会话的每个直接子 agent 调用官方 agents.create 创建完整副本:
meta.parentSession在创建那一刻就指向 fork 子会话(无文件改写、无归属抢夺);meta.origin: 'subagent'、delegationDepth= 父 +1;seed= 原子 agent 的完整持久日志(逐行一致),inheritedEventCount= seed 长度;agentOptions取原子 agent descriptor 里的 provider/model;setup经官方agentPresets.composeFrom(childCtx, forkChildAgent.ctx)加入 fork 子会话的组合(与 spawn 路径同一入口);- 递归:副本的子 agent 同样被复制,整棵子 agent 树跟随;
- 过滤:运行中的子 agent 跳过(记入日志);fork 子会话 seed 未引用的子 agent(属于被分支抛弃的路线)不跟随;
- 操作记录写入
$DSH_HOME/dsh-fork-relink.log。
零 UI、零路由、零依赖、零文件改写:全部走官方 API。任何走官方 fork 的入口(原生分支按钮、其他插件)都被覆盖。
安装
dsh plugin --profile web add "link:<本目录>"
重启 dsh web 生效。卸载:
dsh plugin --profile web remove dsh-fork-relink
测试
真机自测(在真实 web 服务器进程内驱动官方 sessionController.fork):fork 子会话的 session/created 事件触发、两个子 agent 的副本被创建(事件日志与原件逐行一致,仅多官方 seed 标记;头部 parent/origin/depth 正确)、原件不动;守卫三条(排除子 agent 自身创建/普通会话)与 seed 引用过滤均有离线测试覆盖。
已知边界
- 运行中的子 agent 跳过(避免与内存态冲突),记入日志;可等它结束再 fork 一次。
- 副本完整复制子 agent 的历史;若未来官方 fork 支持子树跟随(或提供 children relink/copy API),本插件即可卸载。
No comments yet. Be the first to write one.