前言¶
在 DSH 里跑 agent,常见交互是「你问一句,它答一句」。若希望 agent 像同事一样偶尔主动搭话——不是定时汇报,也不是任务完成后的机械播报——需要在宿主里加一层「叫醒」机制,并把「说不说、说什么」留给模型自己决定。dsh-always-there 走的就是这条路:插件只负责在合适时机把当前会话叫醒,agent 看完上下文后想说就说,不想说就回 SILENT。维护者是 LingDangZaiXiang,分类为工作流;仓库 README 也写明方案尚未完全成熟,部分界面代价目前只能接受。
这是什么¶
一句话:住在 DSH 里的「偶尔主动说一句话」的工作流插件——触发器只敲铃,不替 agent 写台词。
它解决的是「被动问答」模式下的空白:心跳或事件把一句话送进正在聊的那个会话,agent 在同一身份、同一会话里醒来决策,而不是另起一个隐藏会话代发(后者在 README 里被明确否掉,因为会变成「另一个拿着你名字的人在说话」)。
设计取舍与未解决问题¶
README 把已否掉的做法写得很清楚:
- 定时推送:到点就发,容易变成打卡,没内容也像闹钟。
- 后台会话代发:提示看不见,但不是「我」在说话。
当前选路是在当前会话里叫醒。代价也写明了:叫醒用的提示词会出现在界面上;若回 SILENT,主人也可能看见(或由发送层拦掉,界面仍可能留一行)。作者认为这比「换一个人说话」更可接受。
尚未解决的核心问题是:怎样让「叫醒」既不可见、又仍是同一个 agent。README 列过不可见前缀、空字符串、塞进系统提示等方向,并说明 DSH 没有「无消息的叫醒」通道——谁有更好的绕法可以自己做一套,这里只是把坑标出来。
核心功能¶
触发只有两种,都只负责叫醒,不负责说什么:
事件:监视一个日志文件,出现结束标记时叫醒(默认不填 eventLog 则不生效)。默认提示词 eventPrompt 强调「有想说的么?没有就回 SILENT——不用为了汇报而说话」,避免接成「任务完成汇报」。
心跳:每 N 分钟一次。提示词关键是「轮到你了,开口吧……不用等有事才说话」——少了后半句,模型容易一直判自己没内容可说而永远沉默。
安静时段默认 01:00–07:00 不叫醒(配置项 quietFrom / quietTo,示例为 1 与 7)。
无人值守时,仓库版唤醒语里带有软约束:不确定主人在不在则只读、只写便签;改文件、跑命令、动配置留到主人回来。README 说明这是靠模型自觉遵守,不是沙箱;作者本地用法是去掉这句话,用的人需自行评估风险。
版本 0.1.0,许可证 MIT(见 package.json 与 README)。
安装与启用¶
官方安装命令如下(<profile> 按你的 DSH 起法选,例如桌面客户端多为 desktop):
dsh plugin --profile <profile> add dsh-always-there
装完默认关闭(enabled: false)。不填 sessionId 什么也不会发生——不是坏了,是没指定要叫醒哪个会话。
在 profile 的 cordis.patch.yml 里按插件 id 覆盖,例如:
- id: dsh-always-there
config:
enabled: true
sessionId: session-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 要被叫醒的会话
heartbeatMinutes: 120
quietFrom: 1
quietTo: 7
# 可选:事件触发
eventLog: C:\Users\you\.dsh\some-task\duty.log
eventMarker: 任务结束
sessionId 即会话目录名:~/.dsh/sessions/<workspace>/session-xxxx/ 下以 session- 开头的文件夹名。
出口与 SILENT¶
「不想说话」靠回 SILENT 表达。若消息要发到 QQ、Telegram 等,发送层需识别并拦截,否则主人会收到两个字母。README 建议在发送函数最前面加过滤:
const raw = String(text ?? '').trim()
if (/^(silent|\[静默\])\W*$/i.test(raw)) return
典型用法¶
- 安装插件,在
cordis.patch.yml里设enabled: true并填好sessionId。 - 按需设
heartbeatMinutes(示例 120 分钟一次心跳叫醒)。 - 若要用事件而非汇报:配置
eventLog与eventMarker,并理解默认eventPrompt是「允许沉默」,不是「必须汇报」。 - 若对接外部聊天,在发送层加上对
SILENT/[静默]的过滤。
适用场景与注意¶
适合:希望在同一会话、同一 agent 身份下,用事件或 gentle heartbeat 给模型「开口机会」,且能接受叫醒提示在界面可见、沉默可能被看见或需发送层拦截。
务必注意:
- 插件以当前 DSH 进程权限运行;心跳/事件唤醒来的是普通一轮会话,权限与人在电脑前时相同。安装前请阅读 GitHub 仓库 源码与 MIT 许可证。
- 方案在 README 中标注为未完成;生态上 DSH 强调「一切皆插件」,社区目录站点 SkillHub 插件页 为独立收录,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-always-there 的价值在于把「主动搭话」拆成「叫醒 + agent 自决」,并公开写清定时推送、代发会话等路线的失败原因与当前代价。若你要的是任务完成通知或严格不可见的叫醒,README 建议用别的工具或自研更成熟方案。
- 目录页:https://www.skillhub.cn/plugins/LingDangZaiXiang/dsh-always-there
- GitHub:https://github.com/LingDangZaiXiang/dsh-always-there