dsh-parallel-sessions:DeepSeek Harness 并行会话协调插件

前言

DeepSeek Harness(DSH)在本地运行多个会话时,任务之间可能互相干扰:一个会话的改动会影响另一个会话的阶段,或者需要互相传递设计决策。现有方案要么只能单向消息,要么无法在阶段冲突时真正暂停对方。dsh-parallel-sessions 专为 DSH 0.2.1-rc.2 及以上版本设计,在同一个进程内协调并行会话,让它们能互相沟通、共享设计方向,并在阶段冲突时暂停/恢复对方,并在 Chat 中显示清晰的归属信息。

插件定位

  • 名称:dsh-parallel-sessions
  • 维护者:CatLollipop
  • 版本:0.6.0
  • 分类:工作流
  • 核心价值:检测并行会话、带发起方归属的跨会话消息、阶段冲突时暂停/自动恢复。

插件参考了 dsh-cross-session-approval 和 dsh-agent-message 的设计思路,并按 DSH 0.2.1-rc.2 的 Host Service、Session 事件与 Chat 渲染契约重新实现,补上了「阶段冲突时暂停/自动恢复」的协作协议。

核心能力

本插件提供 4 个工具,以 parallel_ 开头,可与 cross_session_* 工具共存。

parallel_sessions

检测同一工作区内并行运行/曾运行过的顶层会话。返回内容包括 cs_ 别名、标题、运行状态、工作目录、暂停关系。

parallel_sessions({
  include_offline: false
})

parallel_message

向另一个会话投递消息。默认 mode=steer 直接送达(运行中在下一步边界立即插入,空闲时立即开一轮);只有显式 mode=queue 才等对方当前整轮结束后再投递。

parallel_message({
  session_id: "cs_xxxxx",
  message: "把登录接口的返回结构改成统一 Result 包装",
  intent: "guide"
})

接收方对话流内渲染为右侧聊天气泡(我收到的消息,正文只含消息内容,底部显示发送方/状态/时间/复制);发送方对话流内渲染为左侧「发给会话「…」」的发送块(我发出的消息)。

parallel_hold

当本任务会影响另一个会话的阶段时暂停它。真实停止其当前运行回合、清除其待处理队列(数量会上报),并投递带发送方归属的暂停通知。

parallel_hold({
  session_id: "cs_xxxxx",
  reason: "我正在重构 B 依赖的 xxx 接口",
  impact: "B 的联调阶段",
  until: "holder-turn-end" // 默认,在本轮任务结束时自动恢复
})

parallel_release

恢复被本会话暂停的会话,并投递带发起方归属的「继续工作」通知与变更摘要。

parallel_release({
  session_id: "cs_xxxxx"
})

典型流程

  1. 会话 A 在推进中发现自己的改动会影响会话 B 正在做的阶段:
    - 用 parallel_sessions 找到 B 的 cs_ 别名;
    - 调用 parallel_hold({ session_id: "cs_xxxxx", reason: "...", impact: "..." });
    - B 的运行回合被真实停止,B 的 Chat 中出现「暂停通知 · 来自「A」」卡片,输入区显示「已暂停 · 等待「A」完成任务」。
  2. A 完成任务、本轮结束 → 插件监听 turn/end 自动恢复 B,B 收到「恢复通知 · 来自「A」」。
  3. 如果 A 只是要沟通(不是暂停):调用 parallel_message({ session_id: "cs_xxxxx", message: "...", intent: "guide" })。

别名与 cross-session 插件互通(v0.5.0)

早期版本使用 ps_ 别名,而同一进程里的 dsh-cross-session-approval 使用 cs_ 别名。v0.5.0 起,本插件改用与 cross-session 完全相同的 cs_ 派生算法(相同的盐与 base64 规则),因此:

  • parallel_sessions 返回的 cs_ 别名可以直接传给 cross_session_* 工具,反之亦然;
  • 本插件仍接受旧版 ps_ 别名(仅本插件支持),历史上已发出的旧消息不会因此失效;
  • parallel_message 的消息头部会提示用同一个 cs_ 别名回复。

只与活动会话沟通(v0.6.0)

  • parallel_message 的目标必须当前已加载(running/idle);offline 会话会被拒绝,并提示先打开会话。
  • 插件不调用 agents.resume,不会创建、恢复或唤醒任何会话;parallel_sessions 默认只列活动会话,传 include_offline:true 仅用于查看离线会话,不能对其发起沟通。
  • parallel_hold 仍要求目标已加载;parallel_release 的恢复通知也只会投递给仍活动的目标,目标已关闭时会在回执里报告未送达。

安装与启用

把本目录作为本地 bundle 安装进当前 profile:

plugin_manager({ action: "install_bundle", target: "<本目录绝对路径>" })

安装后插件行与 Client 半区由 dsh.bundle / dsh.client 自动挂载,无需手改 cordis.patch.yml。工具名以 parallel_ 开头。

配置项

cordis.patch.yml 的插件行支持以下配置(均在代码中有默认值):

键 默认 说明
guide true 检测到并行会话时,向系统提示注入一段简短的协调指引(无并行会话时不注入)。
autoReleaseOnTurnEnd true holder-turn-end 暂停在发起方回合结束时自动恢复。
holdCancel true 暂停时真正取消目标运行中的回合(agent.cancel({kind:'user'}),会清空其待处理队列)。
maxHolds 8 同时存在的暂停登记上限。
pairMessageLimit / pairWindowMs 10 / 60000 同一对会话在滚动窗口内的投递上限,防止两个 Agent 互相刷屏。
maxTextBytes 32768 单条消息正文的 UTF-8 字节上限。

界面显示

每条跨会话消息都是真实的持久化 user/message,来源字段同时携带结构化归属:

{
  "kind": "agent-message",
  "form": "relay",
  "producer": "parallel-sessions",
  "senderSessionId": "session-...",
  "senderTitle": "设计评审",
  "senderAlias": "cs_xxxxxxxxxx",
  "targetSessionId": "session-...",
  "intent": "guide",
  "summary": "把登录接口的返回结构改成统一 Result 包装"
}

Chat 的内置 relay 渲染器据 form: "relay" + senderSessionId 显示「来自会话 …」并渲染正文;点击「来自会话」会打开对应会话的历史窗口并定位到那次发送调用。

插件自带的 Client 半区把跨会话消息渲染为对话流内的聊天气泡(我发出的发送块靠左、我收到的接收气泡靠右)。气泡内只显示消息正文,底部依次是:来自会话「标题」(点击打开发送方会话,并滚动/高亮到本插件渲染的发送块)· 状态(是否继续:如「已暂停 · 等待继续」/「已恢复 · 可以继续」)· 时间 · 复制按钮。发送方一侧通过 tool.call.toolview 把 parallel_message 的工具卡片替换为「发给会话「…」+ 正文 + 已送达」的独立发送块。

适用场景与注意

  • 只协调同一工作区的顶层会话:归档会话、子代理(origin: subagent)与跨工作区会话会被拒绝。
  • 硬限制:本插件不创建新会话、不恢复/唤醒离线会话,只与当前正在活动的会话(running/idle)沟通;目标 offline 时 parallel_message 会直接报错。
  • 暂停登记保存在进程内存中:Harness 重启后不会自动恢复已暂停的会话;重启前请先 parallel_release。
  • agent.cancel 的停止语义属于宿主:它停止当前回合并清空待处理队列。需要保留队列时请把 holdCancel 设为 false(此时暂停仅记录登记并发通知,等待对方自然空闲)。
  • 会话 ID 可能被显示链路遮蔽;所有工具优先使用 cs_ 别名寻址,收到遮蔽占位符会明确报错而不是猜。
  • 若目标发送块远早于当前已加载历史,插件会自动点击 Chat 的「加载更早」最多 80 页来翻找;超过该范围仍会提示未找到,可手动向上滚动后再点一次。
  • 本插件不替代权限审批:暂停/恢复不需要提权,但消息投递遵守目标会话自身的权限与审批策略。

目录

dsh-parallel-sessions/
├── lib/core.js      纯函数:别名、占位符识别、文本截断、归属 source、通知文案、限流
├── lib/index.js     Host:4 个工具、投递/恢复、turn/end 自动恢复、系统提示指引
├── client.js        Client:对话内跨会话气泡(接收方)+ 发送块(发起方),底部含会话跳转/继续状态/时间/复制
├── cordis.patch.yml 自注册补丁
├── locale/*.json    插件管理器显示元数据
└── test/            node:test 单元测试(纯函数 + mock Host)

生态背景

DSH 的理念是「一切皆插件」,本插件遵循这一生态,通过本地 bundle 方式安装,与 DSH 0.2.1-rc.2 的 Host Service、Session 事件与 Chat 渲染契约对接。社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系。

总结

dsh-parallel-sessions 为 DeepSeek Harness 的多会话场景提供了协调能力:检测并行会话、带归属的跨会话消息、阶段冲突时暂停/恢复。它通过 cs_ 别名与 cross-session 插件互通,仅作用于活动会话,并提供了清晰的归属显示与跳转能力。适合需要多个会话协作、共享设计决策、互相暂停/恢复的场景。

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

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

小夜