前言¶
在 DeepSeek Harness(DSH)里,主智能体还在跑工具、子智能体或后台任务时,Composer 自带的排队机制往往会在「主智能体不再说话」时就放行你排队的下一条消息。子智能体和后台任务对 Composer 不可见,因此队列可能在实际工作尚未结束时就把消息交出去。
如果你希望「等主智能体、子智能体、后台任务都不再运行」再发,或者想在主机侧暂存草稿(关标签页也不丢),就需要额外能力。下面介绍社区插件 dsh-hold(维护者 TetraSsky),分类为工作流,独立读写自身数据文件,不依赖其他插件。
这是什么¶
dsh-hold 的作用是:把你在 Composer 里写好的消息先 Hold(暂存),在条件满足后再发送。默认 Harness 队列无法表达「Wait idle(等到完全空闲)」这一维度;本插件补上该选项,并把暂存放在 host 侧,避免仅依赖浏览器会话。
环境要求¶
- 带 web profile 的 DeepSeek Harness。
- 无 job / subagent 服务时,对应检查只会报告「没有在跑的任务」,插件仍可安装使用。
安装与启用¶
1、用官方命令添加插件(web profile):
dsh plugin --profile web add github:TetraSsky/dsh-hold
2、在 $DSH_HOME/profiles/web/package.json 的 dsh.profile.bundles 中加入 dsh-hold,然后重启 Harness。包内的 cordis.patch.yml 会插入所需 bundle 行。
安装前请自行查看 GitHub 仓库 源码与 MIT 许可证;插件以当前 DSH 进程权限运行,只应安装你信任的来源。
核心功能¶
Composer 上的 Hold 按钮¶
在 Composer 工具栏、发送按钮旁会出现 Hold。输入消息后点 Hold,会弹出配置窗口,两个轴可独立组合:
| 轴 | 含义 |
|---|---|
| Send at | 开关。默认关:不设最早发送时间,满足其他条件后尽快发送。打开后可从日历选日期,并用两个下拉框选时、分(不可手输,避免无效时间;今天之前的日期不可选;确认时若时间已过去会被拒绝)。 |
| If the AI is still working | 下拉:Queue (Default) · Wait idle · Send now (Steer) |
界面控件使用 Harness 自带的 Button、Switch、Menu 等,日历由同类按钮拼装;正文为多行 textarea。窗口与暂存列表宽度跟随 Composer,与对话区拖拽手柄一致。
三种发送语义与 Harness 一致:
- Queue (Default):普通跟队下一轮。
- Wait idle:同样交付方式,但仅在会话 真正结束 后发送(本插件 headline 场景)。
- Send now (Steer):在最近的 step 边界插入;对已是 idle 的智能体与排队等价,不会「 steer 」已停下的智能体。
例如:设定「下月 15 日 09:30」且选 Wait idle,表示到点后若会话仍在进行则继续等到完成再发;不设时间只选 Wait idle,即「一空闲就发」——Harness 自带队列做不到的组合。
「finished(结束)」如何判断¶
发送前会同时查内存注册表,三项都满足才算结束:
| 检查项 | 来源 |
|---|---|
| 无主智能体在跑 | agent.status 为 idle(整轮含工具调用) |
| 无 live 子智能体 | 本会话名下 status 仍为 running 的子智能体 |
| 无后台 job | ctx.jobs.list(agent),排除 completed / killed / failed |
可继续的子智能体按 agent status 判断,不按是否 resident,避免已结束但仍驻留的子智能体永远挡住发送。待你审批、提问、计划确认等会保持主智能体 running,无需单独检查。
若当前会话没有 live agent,消息会被 保留,等会话再次运行后再投递,不会丢弃。
暂存列表(held list)¶
当前会话的 Hold 显示在 Composer 上方,数量不限。仅一条时直接展示;两条及以上折叠为 {n} held messages(带队列图标与 chevron),展开列表最高约 180px 可滚动。
每条可 Edit(重开窗口改正文、附件与两轴)、Send now(立即发送,忽略等待条件)、Delete。行上会说明在等什么(如主智能体、后台 job)或是否已就绪,有定时则显示倒计时。
多条同时到期时 从旧到新 逐条发出。Wait idle 发出一条后 session 可能重新 busy,下一条会等下一次完成;Queue 或 Steer 不受空闲门控,同一轮仍按最旧优先。Send at 只决定何时变为 ready,不决定同一时刻发几条。
语言与附件¶
窗口与拒绝提示跟随界面语言(英文或中文)。Hold 会带上 Composer 已 staging 的图片与文件;窗口里可预览并在确认前移除附件。图片以字节暂存以便列表缩略图;文件在上传 receipt 仍有效时解析为 durable 引用,无法解析则拒绝 Hold。附件进入 Hold 后会从 Composer 栏移除,避免误随下一条普通发送。上传中或上传失败时不能 Hold,并会给出原因。
典型用法¶
1、智能体长任务(含子智能体或后台 job)进行中,你想追加指令但不想打断当前轮:写好内容 → Hold → If the AI is still working 选 Wait idle → 确认。主智能体、子智能体与相关 job 都空闲后自动发送。
2、希望稍后再发且仍要避开 busy:打开 Send at,选日期与时间 → 配合 Wait idle 或 Queue,确认后可在 held list 里 Edit / Send now / Delete。
3、需要 steer 时选 Send now (Steer),在 step 边界插入;空闲时与排队行为一致。
适用场景与注意¶
- 适合:依赖 subagent、background job 的 web 会话;需要「真正 idle 再跟一句」;需要关页后仍保留待发草稿。
- 注意:插件只读写自身文件;无 subagent/job 时 idle 检查仍可用但对应项恒为空。社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,DSH 生态是「一切皆插件」的独立社区分发方式。
结尾¶
dsh-hold 在 Harness 自带队列之上增加了 Wait idle、定时 Send at 与 host 侧暂存,并把「结束」定义为无主流、无 running 子智能体、无未完成 job。安装命令与 bundle 配置见上文;细节以 README 为准。
- 目录页:https://www.skillhub.cn/plugins/TetraSsky/dsh-hold
- GitHub:https://github.com/TetraSsky/dsh-hold