dsh-seance:在删除子 Agent 会话之前,先听一听残留日志

前言

在 DeepSeek Harness(DSH)里跑工作流时,子 Agent 会话可能被中断、报错或未正常结束,日志仍留在当前项目里。常见做法是直接清理或忽略。但若想在不重放完整对话、不打开调试器的前提下,快速弄清「它最后卡在哪、说了什么」,缺少一个轻量、只读的入口。

dsh-seance 面向这一环节:从已终止的子 Agent 会话日志里提取一小撮碎片,聚合成一个只能依据这些碎片回答的临时「幽灵」,在对话框里最多问几个问题,关闭即销毁。它不是调试工具,不是可观测性面板,也不是会话清理器。

这是什么

  • 插件名称:dsh-seance(GitHub:edwardyh/dsh-seance,维护者 edwardyh)
  • 分类:工作流
  • 环境要求:DeepSeek Harness >=0.2.2-rc.1(README 注明当前仅在 0.2.2-rc.1 验证过)
  • 许可证:MIT

一句话定位:在删除或归档之前,用只读碎片做一次有限问答,而不是把子 Agent 重新拉起来执行工具。

核心功能

入口与执行流程

命令面板中唯一的命令为 /dsh-seance.summon,显示为「招魂」,也可直接输入该命令执行。

经过上面的步骤,插件会:

  1. 通过 ctx.sessionQuery.filterSessions 查询当前工作目录下的会话,筛出 live: false、parentSession != null 且日志仍可读取的候选。
  2. 没有候选时提示「没有可招魂的残留会话」。
  3. 有候选时,在临时对话框列出:子 Agent 标题(或最后一条 user/message 的截断摘要)、结束原因;选择后提取碎片、创建幽灵并开始有限对话;对话框关闭即销毁幽灵。

命令注册在客户端命令面板(ctx.commandUi 的 action 类型),因此不会产生宿主 command/run、command/done 日志,也不会把命令结果写进会话。

碎片提取规则

只提取下列内容(明确不提取完整对话历史、成功工具结果、可重放任务的完整指令等):

碎片 来源
失败的工具调用 tool/result 且 message.isError === true 或 data.error 存在
非正常结束 turn/end 且 reason.kind 为 interrupted、aborted、blocked、error、max-tokens、forked
未完成步骤里的最后片段 最后一个未闭合 step/start 之后到日志末尾的 assistant/message / assistant/attempt 文本
它最后看到的话 最后一条 user/message 的 content(截断;跳过框架注入行)
位置 一行父子链信息(父会话 id 前缀 + 深度)

硬预算:碎片总长约 800 token(按 4 字符 / token 折算约 3200 字符);超预算时优先保留靠后的事件,最后一条 user/message 单独预留额度。

幽灵的创建与限制

幽灵不是可持久化的 Agent 会话。实现上直接调用 ctx.llm.stream(),messages 仅含碎片与当前问题;不传 tools、toolHistory、sessionId;每次提问独立,不携带父会话历史或 AGENTS.md。

客户端与宿主双重限制:最多 3 个问题,第 4 个请求会被宿主拒绝。幽灵没有工具、不能执行任务、不能写入,对话结束即销毁;被招魂的原始会话日志只读,插件不修改、不清理。

通信与 UI 依赖

宿主通过同源 POST /dsh-seance/api 与客户端通信(x-dsh-seance: 1 + application/json);幽灵状态只在内存中保存,不写文件、不写会话。依赖 Web GUI 的 shell.overlay 浮层与 @deepseek-ai/dsh-client-ui-commands;无侧边栏、无设置页、无 headless/ACP 适配。

安装与启用

plugin_manager 是 Harness 会话内的 Agent 工具,不是 shell 命令。

通过 npm 安装包体

npm install dsh-seance

npm install 只把包放进依赖;要在当前 profile 中启用,仍需在 Harness 会话中通过插件管理器安装本地包:

  • 调用 plugin_manager install_bundle,target 指向 node_modules/dsh-seance 的绝对路径。

通过本地包目录安装(README 中的当前验证方式)

在会话中调用:

  • plugin_manager install_bundle,target 为包目录的绝对路径(例如 /absolute/path/to/dsh-seance)。

安装后 /dsh-seance.summon 应出现在命令面板。

卸载

在 Harness 会话中调用:

  • plugin_manager remove_bundle,target 为 dsh-seance。
  • 单独停用/启用:plugin_manager set_plugin,target 为 include:dsh-seance。

典型用法

  1. 确认 Harness 版本满足 >=0.2.2-rc.1,并已安装、激活插件。
  2. 在命令面板执行 /dsh-seance.summon(「招魂」)。
  3. 在列表中选择要询问的已终止子会话,在对话框里针对碎片提问(最多 3 次)。
  4. 问完后关闭对话框;幽灵与在途请求一并清理。

宿主侧验证候选列表(需先安装并激活,将 <port>、<当前会话 id> 换成实际值):

curl -s -X POST http://127.0.0.1:<port>/dsh-seance/api \
  -H 'content-type: application/json' \
  -H 'x-dsh-seance: 1' \
  -d '{"op":"candidates","parentSessionId":"<当前会话 id>"}'

开发者可在包目录运行单元测试:

npm test

适用场景与注意

适合谁:在同一 workspace 内处理子 Agent 异常结束、想在删日志前做一次只读「复盘」的 DSH 用户;需要完整 trace、工具重放或跨 workspace 招魂的场景不适用。

已知限制(摘自 README):幽灵是单次 ctx.llm.stream 补全,非独立子 Agent;仅当前 cwd 下的子会话;依赖当前会话模型路由或默认模型,无独立选模入口;回答非流式;命令与对话框文案以中文为主;仅 Web GUI。

安全与权限:插件以当前 DSH 进程权限运行,可读取当前工作目录下符合条件的会话日志。安装前应查看 GitHub 仓库 源码与 MIT 许可证,确认与你的工作流策略一致。

DSH 生态强调「一切皆插件」;社区目录 SkillHub 上的 dsh-seance 页 为独立站点展示,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-seance 的价值在于:删除之前,用极小的碎片预算和三次提问,听一听已终止子 Agent 留下了什么——不冒充调试器,也不改写日志。进一步了解请访问 目录页 与 GitHub。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye