dsh-always-there:让 DSH agent 有机会自己开口

前言

在 DSH 里跑 agent,常见交互是「你问一句,它答一句」。若希望 agent 像同事一样偶尔主动搭话——不是定时汇报,也不是任务完成后的机械播报——需要在宿主里加一层「叫醒」机制,并把「说不说、说什么」留给模型自己决定。dsh-always-there 走的就是这条路:插件只负责在合适时机把当前会话叫醒,agent 看完上下文后想说就说,不想说就回 SILENT。维护者是 LingDangZaiXiang,分类为工作流;仓库 README 也写明方案尚未完全成熟,部分界面代价目前只能接受。

这是什么

一句话:住在 DSH 里的「偶尔主动说一句话」的工作流插件——触发器只敲铃,不替 agent 写台词。

它解决的是「被动问答」模式下的空白:心跳或事件把一句话送进正在聊的那个会话,agent 在同一身份、同一会话里醒来决策,而不是另起一个隐藏会话代发(后者在 README 里被明确否掉,因为会变成「另一个拿着你名字的人在说话」)。

设计取舍与未解决问题

README 把已否掉的做法写得很清楚:

  1. 定时推送:到点就发,容易变成打卡,没内容也像闹钟。
  2. 后台会话代发:提示看不见,但不是「我」在说话。

当前选路是在当前会话里叫醒。代价也写明了:叫醒用的提示词会出现在界面上;若回 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

典型用法

  1. 安装插件,在 cordis.patch.yml 里设 enabled: true 并填好 sessionId。
  2. 按需设 heartbeatMinutes(示例 120 分钟一次心跳叫醒)。
  3. 若要用事件而非汇报:配置 eventLog 与 eventMarker,并理解默认 eventPrompt 是「允许沉默」,不是「必须汇报」。
  4. 若对接外部聊天,在发送层加上对 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
羽毛球分组比赛记分
小程序二维码

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

小夜