dsh-always-there · 一直在你身边
让 agent 有机会自己开口的插件。
这是一个未完成的方案。开头先把它卡在哪写清楚。
我们想要什么
一个住在 DSH 里的 agent,能像人一样,偶尔主动说一句话。
不是定时汇报,不是播报,是「刚才想到个事,跟你说一声」那种。
试过、否掉的两条路
一、定时推送 到点就发一条。结果它变成了打卡——没内容也发,久了像闹钟,不是人。
二、后台会话代发 叫醒一个隐藏的会话,让它在后台想说就说。 看着完美:提示看不见,沉默也看不见。但它不是「我」——是另一个拿着我名字的会话在替你说话。这跟「主动搭话」类插件没有区别。
现在选的路
在当前会话里叫醒。 心跳或事件把一句话送进正在聊的那个会话,agent 醒来、看一眼、想说就说,不想说就回 SILENT。
代价很具体:
- 提示词会出现在界面上,主人看得见
- 「不想说」的那句
SILENT也看得见(或者被桥拦掉,但界面里仍留着一行)
我们接受了这个代价,因为「换一个人说话」比「看见一行提示」更糟。
没解决的问题
怎么让「叫醒」既不可见、又还是同一个 agent?
想过的方向,都不够好:
- 给提示词加不可见前缀 → 界面还是渲染
- 让沉默返回空字符串 → 界面还是留一条空消息
- 把叫醒塞进系统提示词 → DSH 没有「无消息的叫醒」通道
如果你知道更好的做法,不必回来给我们提修改建议,直接自己做一套更成熟的就好。我们这里只是把坑标出来,谁能绕过去,谁绕。
现在能用的部分
触发只有两种,都只负责「叫醒」,不负责「说什么」:
- 事件:盯一个日志文件的结束标记(默认是某一轮任务跑完那一行)
- 心跳:每 N 分钟一次。提示词关键是「轮到你了,开口吧……不用等有事才说话」——少了后半句,模型会一直判自己没内容可说,然后永远沉默
安静时段默认 01:00–07:00 不叫。
许可
MIT。
安装与配置
dsh plugin --profile <profile> add dsh-always-there
装完默认是关的(enabled: false)。在 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/。
出口要配合
「不想说话」靠回 SILENT 表达。如果消息要发到聊天软件(QQ、Telegram 等),发送层要认这个标记并拦掉,否则主人会收到两个字母。
这段过滤很短,加在发送函数最前面:
const raw = String(text ?? '').trim()
if (/^(silent|\[静默\])\W*$/i.test(raw)) return
⚠️ 装完先做这件事
装上之后它是关着的。 不填 sessionId 就什么也不会发生——不是坏了,是没告诉它该叫醒谁。
在你的 profile 里按 id 覆盖这几个字段:
- id: dsh-always-there
config:
enabled: true # 打开
sessionId: session-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 必填:要叫醒哪个会话
heartbeatMinutes: 120 # 多久叫一次
sessionId 去哪找:~/.dsh/sessions/<工作区目录>/ 底下那个 session- 开头的文件夹名,就是它。
profile 是 desktop 还是 web,看你的 DSH 怎么起的——如果你是通过桌面客户端用的,就是 desktop。
事件触发:别把它接成汇报
事件触发(盯一个日志文件、出现某个标记就叫醒)很容易被写成「任务跑完了,汇报一下」。
那就本末倒置了:本来是想让它「想说才说」,一接任务完成,它就从「一个人」变成「一个报工单的」。
所以事件用的提示词是 eventPrompt,默认:
有件事刚发生。有想说的么?没有就回 SILENT——不用为了汇报而说话,没感觉就让它过去。
关键差在允许沉默。心跳是「轮到你了」,事件是「有事发生了,你想说就说」——两个都不是命令。
事件触发默认关着(不填 eventLog 就不生效)。要开,想清楚你要的是「有人想说句话」还是「任务完成通知」,后者用别的工具更合适。
无人值守的那一轮
心跳和事件唤醒来的是普通的一轮会话,权限跟人坐在电脑前时完全一样:能读文件、能跑命令、能改配置。
问题在于:这时候多半没人看着。
所以唤醒语里带了一句:不确定她在不在,就只读、只写便签;改文件、跑命令、动配置留到她回来的那一轮。
说清楚限制在哪:这是软约束,靠被唤醒的那一方读到后自觉遵守,不是沙箱。要真拦,得在宿主层做工具闸门。
我们自己的用法是反过来的:知道这一层之后,本地把这句话去掉了——用的人得自己意识到,而不是靠一句话管着。仓库这版留着,给需要的人。
No comments yet. Be the first to write one.