dsh-nest: Using "Session Dependency" in DSH to query a sub-session as an agent

前言

在 DeepSeek Harness(DSH)里做多会话协作时,常见做法是复制历史、新开分支,或在侧边栏里手动切会话。子会话有自己的模型、工具和日志,母会话只想「问它一句、拿回答」,往往要付出上下文搬运或树结构改动的成本。

dsh-nest(仓库 epsilonH-eps/dsh-nest)给 DSH 装一个逻辑上的「巢」:在 设置 → 会话从属 里用下拉框安排谁归谁管,母会话再通过工具 原地唤醒 子会话、投一句话、等它答完——不复制历史,也不改 DSH 侧边栏里的会话树。下面介绍它是什么、能做什么、怎么装、怎么用,以及使用时必须知道的边界。

这是什么

维护者 epsilonH-eps,社区目录分类为 工作流(SkillHub 目录页)。插件当前版本 0.3.0(见仓库 package.json),许可证 MIT。

一句话定位:关系存在本机 $DSH_HOME/dsh-nest/relations.json,只决定「谁能访问谁」;访问时动的是目标会话自己的 id、header 和历史,新的一轮写进它的日志。

核心功能

面板:设置 → 会话从属

  1. 自动列出本机 所有 会话(标题、创建时间、是否开着),按关系排成树,子会话缩进。
  2. 每行「上级」在 + 挂到… 下拉里 用标题选 母会话;标签上的 × 去掉一条关系。
  3. 一个子会话可以同时挂在多个母会话下面,几个母都能访问它。
  4. 母会话行前 ▾/▸ 折叠子会话;每行 👁 单独隐藏/显示;折叠与隐藏记在浏览器 localStorage(键 dsh-nest:panel)。
  5. 顶部搜索按标题或 id 过滤;面板拒绝成环、自挂。

关系 不改 任何会话日志/header,也 不改 DSH 侧边栏会话树——只是逻辑从属。

工具:把子会话当 agent 用

会话 A ─┐
        ├──问一句──▶  会话 B(原样,原地继续)
会话 C ─┘                 │
        ◀──── 它的回答 ────┘
  • 访问的是 B 本身;B 看得出是谁在问:消息带 agent-message 来源(form: relay,senderSessionId 为发起方)。
  • B 没开着就临时 resume,答完 dispose;已开着则复用当前 agent。
  • 工具参数里 省略 session 表示问「我的子会话」:面板里挂给当前会话的那些;只有一个时直接问,多个时会列出来让你点名。
工具 作用 主要参数
nest_list_sessions 列出会话,标出当前/子会话/开着/归在谁下面/下级数量 query、limit
nest_ask_session 投一句话,等回答并带回 message、session(可省略)、wait_seconds

返回 { sessionId, status, reply, waitedSeconds }:idle 答完;running 超时未等完(目标继续跑);error 本轮失败(原因在 reply)。

安装与启用

资料中的示例是在 Windows 上已写好插件目录并装进 desktop profile;换 profile 时用符号链接并把 bundle 写进 profile(不是 凭仓库名拼接通用 dsh plugin add 命令):

New-Item -ItemType SymbolicLink -Path "$env:USERPROFILE\.dsh\profiles\<profile>\node_modules\dsh-nest" -Target "D:\dsh-mod\dsh-nest"
# package.json: dependencies 加 "dsh-nest": "link:D:/dsh-mod/dsh-nest";dsh.profile.bundles 加 "dsh-nest"

宿主要求(package.json):dsh >=0.1.7-rc.1,Node >=22。

在 profile 的 cordis.patch.yml 里挂上插件(id 为 nest):

- id: nest
  name: dsh-nest
  config:
    enabled: true
    maxListed: 25
    titleScan: 60
    askTimeoutSeconds: 180
    panelTitleScan: 200

改这份 patch 会触发宿主热重载,不用重启;改插件 lib/ 代码需重启。改 client.js 后需 刷新页面。面板没出现时见下文「面板不出现时的排查」。

配置字段 默认 含义
enabled true 关闭则不挂工具与面板接口
maxListed 25 列会话时最多给模型看几条
titleScan 60 按标题搜时最多读多少条标题
askTimeoutSeconds 180 默认等待秒数;wait_seconds 可单次覆盖,上限 900
panelTitleScan 200 面板一次最多读多少条会话标题

典型用法

  1. 打开 设置 → 会话从属,在目标子会话的「+ 挂到…」里选母会话(可多选)。
  2. 回到母会话,用自然语言或工具让模型去问,例如:「问一下你的子会话,它那边测试跑完没有。」

关系表 v2 形态示例(parents 为「子 → 一组上级」):

{
  "version": 2,
  "updatedAt": 1793180938448,
  "parents": {
    "3b14ac2d-...": ["session-f2c084b0-...", "c0f0eaf6-..."],
    "session-d2900ad9-...": ["social-8b23659d-..."]
  }
}

面板通过本机回环 API 读写关系(节选):GET /api/dsh-nest/relations;POST 加边、删边、整组替换或清空某子的上级。详见仓库 README。

适用场景与注意

适合:母会话编排多角色(测试、文档、专项 agent),需要 短问短答 且保留各会话独立日志与工具链;需要 一子多母 共享同一个子会话。

务必知晓的边界(插件以当前 DSH 进程权限运行,安装前应自行查看源码与 MIT 许可证):

  • 被访问的会话会 真的跑一轮,消耗其 token、模型与工具,可能改文件。
  • 不能访问自己,也不能访问 DSH 血缘里的 上级,避免死锁。
  • 目标已在别的进程开着时可能 唤不醒;两个母会话同时问同一子会话会 排队。
  • 超时不掐断 目标:返回 running 后它继续跑;回答取「这一问之后最后一条带文字的助手消息」。
  • 关系是逻辑的,不会在 UI 会话树里变成父子节点。

客户端在 页面加载时 注册;装完需刷新。若「设置 → 会话从属」仍没有,可请求:

http://127.0.0.1:65133/api/dsh-nest/client-status

present: false 时可试 ?reset=1 清识别缓存(README 说明:首次加载时若 package.json 尚无 dsh.client 声明,宿主可能缓存「无客户端」,导致工具在、面板永不出)。

结尾

dsh-nest 用本机关系表 + 两个 nest 工具,把「谁管谁」和「问子会话一句」拆开:面板管从属,母会话管 relay,子会话仍在原处续聊。DSH 生态是「一切皆插件」;SkillHub 目录为社区站点,与 DeepSeek / 幻方无官方从属关系。

  • 目录页:https://www.skillhub.cn/plugins/epsilonH-eps/dsh-nest
  • GitHub:https://github.com/epsilonH-eps/dsh-nest
羽毛球分组比赛记分
小程序二维码

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

Xiaoye