DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

LingDangZaiXiang /

LingDangZaiXiang/dsh-always-there

Verified

一直在你身边。让 DSH 的 agent 有机会自己开口。

★ 0 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@bc6738c2

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 就不生效)。要开,想清楚你要的是「有人想说句话」还是「任务完成通知」,后者用别的工具更合适。

无人值守的那一轮

心跳和事件唤醒来的是普通的一轮会话,权限跟人坐在电脑前时完全一样:能读文件、能跑命令、能改配置。

问题在于:这时候多半没人看着。

所以唤醒语里带了一句:不确定她在不在,就只读、只写便签;改文件、跑命令、动配置留到她回来的那一轮。

说清楚限制在哪:这是软约束,靠被唤醒的那一方读到后自觉遵守,不是沙箱。要真拦,得在宿主层做工具闸门。

我们自己的用法是反过来的:知道这一层之后,本地把这句话去掉了——用的人得自己意识到,而不是靠一句话管着。仓库这版留着,给需要的人。

—/ 5

No ratings yet

Verified DSH bundle

Commit bc6738c281f6

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout