前言¶
DSH 官方 fork 功能在创建新会话时,原会话的子 agent 记录仍指向旧会话。这导致 fork 出的新对话中,子 agent 面板为空,虽然记录仍在磁盘上,但脱离了新对话。dsh-fork-relink 监听 session/created 事件,为原会话的直接子 agent 创建完整副本并挂载到新会话下。
功能特性¶
该插件通过监听官方事件来实现子 agent 的迁移与保留:
- 事件监听与筛选:监听
session/created事件,仅对isSeeded且有parentSession且非subagent的会话(即 fork 子会话)进行操作。 - 递归复制树:为原会话的每个直接子 agent 调用官方
agents.create创建完整副本,并递归复制整棵子 agent 树。 - 元数据保留:复制子 agent 的面板、代理路由、descriptor、label 等信息。
- 冷会话机制:副本是冷会话,落盘后释放活体。副本与原件互不干扰,副本通过官方恢复路径唤醒。
- 目录登记:创建副本后向父会话追加官方
subagent/catalog,确保副本在子代理面板中可见。 - 日志代际处理:按代际读取会话日志(
session.vN.jsonl.zstd),自动读取最高代际文件,不把代际号写死。 - 运行状态过滤:跳过当前运行中的子 agent,避免与内存态冲突,并将跳过的记录记入日志。
安装与启用¶
安装插件后需重启 dsh web 生效。
从 GitHub 安装¶
dsh plugin --profile web add github:Enosensu/dsh-fork-relink
本地开发¶
直接指向工作目录:
dsh plugin --profile web add "link:<本目录>"
卸载¶
dsh plugin --profile web remove dsh-fork-relink
使用与限制¶
安装插件后,fork 出的新对话将自动拥有子 agent 副本,但需注意以下特性:
- 冷会话唤醒:副本是冷会话,首次发消息需要通过冷恢复唤醒。插件日志会记录每个副本的可寻址性。
- ID 使用:必须使用
list_agents返回的副本 ID 发送消息。原 ID 仍归旧分支,对新父会话会返回UNAUTHORIZED: belongs to another parent session。 - 队列消息:继承的排队消息不再由本插件呈现。0.3.0 版本已删除补位条,官方队列条会直接显示继承项。
- 零依赖:插件完全零依赖、零文件改写,所有操作均通过官方 API 完成。
适用场景¶
该插件适合需要在新 fork 对话中继续与原子 agent 进行交互的开发者。它解决了官方 fork 后子 agent 面板为空、记录无法在新对话中可见的问题,但要求用户在 fork 后使用副本 ID 进行操作。