Repository navigation
Releases: Yuuyuko-uu/dsh-qq-link
Release list
v1.4.6
1.4.6 — 2026-11-01
「检查更新」以前会报错版本,而且只给一条命令让你自己手动复制、然后手动装
- 🐞 "最新版本"会骗人:以前是「哪个地址先返回就用哪个」。GitHub 一超时就落到 jsDelivr ——
那个地址带 CDN 缓存、会滞后好几天,于是同一分钟内能报出好几个不同的"最新",
甚至比你本机装的还旧,看着像"该降级"。 - ✅ 现在三个源全查(GitHub / jsDelivr / npm registry),取版本号最大的那个:
版本只会往前走,哪个源报小了就是它滞后。三个都失败才说"查不到",绝不把旧值当成"最新"。 - ✨ 检测到新版可以直接装:那一块多了一个「一键更新到 vX」按钮,点它走 DSH 自己的插件管理装最新版,
装完会提示你重启(或重载)一次。以前只有一个「复制命令」,得你自己去终端敲两行。 - 🧹 界面上那些命令行全删了:以前那两行
dsh plugin --profile web remove/add和「复制命令」按钮不再显示 —— 很多人看不懂,还得跑来问。现在有新版就只有「一键更新到 vX」一个按钮。 - ⚠ 本地开发副本(link: 进来的那种)不给一键装 —— 那会把正在改的目录换成仓库里的版本;
这种会明确写出来,让你手动更新。
v1.4.5
1.4.5 — 2026-10-31
正文里写文件链接,就把那个文件传到 QQ
- ✅ 这一轮的正文里出现
[报告](D:\x\报告.docx)这种普通 markdown 链接,且那一轮正常结束,
就把那个文件真传过去(走 OneBot 的upload_private_file/upload_group_file)。 - 跟图片分得清:
是图片(发图那条路),[名](路径)才是文件;
http(s)://开头的链接和#锚点一律不当文件。 - 路径带空格就写尖括号:
[报告](<D:\我的 文档\报告.docx>)。 - 找不到 / 超过上限都往日志记一句(不然人以为发了,其实什么都没出去)。
- ✅ 新增「只往私聊发(群里不发文件)」,默认开 —— 大群里发文件容易出问题
(群文件权限、刷屏、审核),私聊最稳。关掉之后群里也会传。
群里被跳过时会记一句,看得见为什么没发。 - 新增三个设置项:开关「发文件(它 → QQ)」、单个文件上限(默认 50MB,最大 2048)、
开关「只往私聊发(群里不发文件)」(默认开)。 - 自测:宿主半边、网页半边全过。
v1.4.4
1.4.4 — 2026-10-31
「按句子拆」存不住;正文里叫名字也能算点名;「只回 QQ 唤醒」不再一刀切
① 「按句子拆」勾上、保存,自己弹回去
- 🐞 1.4.3 给这个开关加了界面、加了默认值、也加了业务逻辑,唯独漏在归一化的字段白名单里。
归一化会把不认识的字段直接扔掉,于是:勾上 → 保存 → 后端回一份没有这个字段的配置 →
前端拿返回值一覆盖,勾就变回空的;磁盘上的配置文件里也从来没有这一项。 - ✅ 补进白名单;另加两条测试(开着、关掉,都能存住)。
② 正文里直接叫名字,也算点名
- ✅ 新增「正文里叫这些名字也算点名」。多个用逗号或空格隔开,留空 = 关着(跟以前一样)。
- 以前群里只认 @ 和引用;有人直接说「让它帮我干活」「去问问它」,既没 @ 也没引用,
只能靠「回复概率」掷骰子,大概率被丢掉 —— 而人看到的是「名字被叫了却没回应」,
很难想到是概率拦的。 - 这一项同样放进白名单(不会再犯上面那个错)。
③ 「只回 QQ 唤醒」不再一刀切
- 🐞 以前这道闸的判据是「最近十分钟内有没有 QQ 消息进来」,于是自动触发的轮次
(主动搭话、到点刷 B 站)也一起被挡了 —— 它们根本不是「你在窗口里自己聊」。 - ✅ 现在按这一轮的来源(
source.kind)分开看:
· 你自己在 DSH 窗口里打的字 → 一律留在本地(这才是「只回 QQ 唤醒」本来要挡的东西)
· QQ 转进来的 → 照常发
· 自动触发的 → 看下面那个新开关 - ✅ 新增「自动触发的也发(主动搭话 / 定时任务)」,默认关,老用户行为完全不变;
开了之后那几轮也会推到手机。 - 自测:宿主半边全过。
v1.4.3
1.4.3 — 2026-10-30
群里「只听点名」管不住自己发的话;长回复拆成一条条;人设的三个坑
① 「只听点名」现在对群里所有人生效
- 🐞 以前有一条捷径:自己(绑定的那个私聊号)在群里说的话会绕过点名过滤,直接收进来。
于是在群里随手发点东西(地址、key、别处的聊天记录),也会被当成「对着它说」。 - ✅ 现在「只听点名」一开,群里任何人(包括自己)都要 @ 或引用才收。
- ✅ 新增每行一个 「不受点名限制的 QQ」 名单:填进去的号不用点名也直接收
(但不算点名 —— 不触发「点名必回」,也不消耗「点名之后接着听」的条数)。
逗号/空格/中文逗号/顿号/分号/换行都能分,写几个都行,默认空。
② 长回复可以按句子拆(默认关)
- 🆕 配置
按句拆:开着时按句末标点切(。!?;…和.!?;),一句一条,像人一条条打字。 - 规则做得保守:连续标点(
?!、……)算一处不重复切;标点后紧跟的右引号/右括号留在这一句;
括号里的标点不算断句(不然一句话被切成两半);空行照样是硬边界。 - 默认关 —— 老用户升级后行为一点不变。设置页在「发出去的样子」那一栏。
③ 人设三处
-
🐞 2000 字上限静默截断:设置读入和挂载时都
.slice(0, 2000),超出的部分直接没了、界面上也没提示。
现在上限放到 2 万字(只做保护,不再悄悄砍)。 -
🐞 只在收到 QQ 消息时挂载:Harness 重启之后,如果第一个回合是定时任务 / 主动搭话触发的,
那一轮就没有人设。现在跟着心跳每跳补一次(同一个 agent、同一段文本会秒返回)。 -
🐞 会话实例替换后不重新挂:缓存只比「文本变没变」,会话被恢复成新实例之后文本没变,
就判定「已经挂上了」直接返回,人设其实没挂到新会话上。现在缓存认 agent 实例。 -
自测:宿主半边 218 项、网页半边全过。
v1.4.2
1.4.2 — 2026-10-30
装不上 / 看不懂日志的两处小坑
- ✅ README 的安装那节补了一条不用 git 的装法:
github:那种写法会让包管理器去 clone 仓库,
机器上没装 git 就会报ERR_PNPM_GIT_FETCH_FAILED;改用 tarball 直链就能装。 - ✅ 「补投窗口」跳过老消息时,日志后面补了一句「想看内容可以回 QQ 里翻聊天记录」——
以前只写「这条已经是 1165 分钟前的了,不再补投」,用户看着像消息丢了。
v1.4.1
1.4.1 — 2026-10-30
被点名之后会接着听几句;能看 QQ 空间、能发说说
- ✅ 群里默认「只听点名」时,被 @ 或引用之后,同一个群里后面紧跟着的普通消息也会转进来:
接够「点名后接听条」就停,或者过了「点名后接听秒」就停,然后退回「只听点名」。- 两项新配置:「点名后接听条」默认 5(范围 0~50,0 = 关掉这个功能,回到老行为)、
「点名后接听秒」默认 120(范围 0~600);设置页在「提示与门槛」。 - 状态按聊天(群号)分开记:一个群在接听,不影响别的群;私聊完全不受影响。
- 接听中进来的话不算点名,不会把条数又重置一遍,也不影响「点名必回」那套判定。
- 「该不该放进来」抽成了纯函数
该收这条(导出,单测直接喂)。
- 两项新配置:「点名后接听条」默认 5(范围 0~50,0 = 关掉这个功能,回到老行为)、
- ✅ 新增四个工具(挂在绑了 QQ 的那几间会话上,走同一个 NapCat / SnowLuma 地址和令牌):
qq_space_list:看某个号(不填 = 机器人自己)的说说,返回总数;每条带 tid / 时间 / 正文(截到 200 字)/
评论数 / 是否私密 / 图片数;qq_space_detail:看一条说说的正文和评论;qq_space_feeds:好友动态流(默认 10 条),html 先去掉标签、压掉空白再截断;qq_space_post:发说说,可以带图,ugc_right支持 1 / 4 / 16 / 64 / 128,16 / 128 没给名单就直接说清楚、不发。
- ✅ 发说说单独一道闸「允许发空间动态」(默认关):关着的时候工具照常在,但一调只说一句「没开」,
一个请求都不会发出去。设置页在「发消息 → QQ 空间」。 - ✅ 空间接口报错时把后端的中文说明带出来,不吐 JSON;「这个号没发过说说」(retcode 100、wording 里带
msglist:null)翻译成「这个号的空间里还没有说说」,不当成故障。 - ✅ 设置页多了一个 「空间」 页(原来的「发消息」改名 「消息」、「提示与门槛」改名 「门槛」,
检查更新单独拆成 「更新」 页):- 定时发说说:一行一个时间,可以加多条(上午一条、下午一条都行),每条能单独选可见范围、单独启用;
到点只往会话里递一句提醒,正文由它自己写,这里不预置任何文案。 - 定时看一圈:开着就按「多少分钟」去拉一次好友动态;两个子开关都关时连请求都不发。
- 自动点赞 / 允许评论:点赞挑最近三天里没点过的(每次最多 3 条、一天最多 20 条,跳过自己发的、点过的记下来不重复);
评论是把新动态递进会话,评不评、评什么由它自己决定。
- 定时发说说:一行一个时间,可以加多条(上午一条、下午一条都行),每条能单独选可见范围、单独启用;
- ✅ 「允许发 QQ 空间动态」那道闸从「消息」页搬进「空间」页;「转发进来会变成什么样」那张卡删了。
- 测试:宿主半边 202 项(新增 45 项)、网页半边 23 项(新增 11 项),其余三套全过。
v1.4.0
1.4.0 — 2026-10-30
同一间会话可以同时绑私聊和群聊了(两边都收、都发)
- 🐞 以前有条规矩「一个会话只绑一条」,所以「私聊 + 一个群都指向同一间会话」做不到 ——
第二行保存时会被静默挡掉。 - ✅ 现在按聊天去重(同一个私聊/同一个群只能绑一条),不再限制「一个会话绑几条」。
- ✅ 发出去的时候:这间会话绑了几个聊天就发几个;其中哪一行关掉了(「启用」没勾)就跳过它。
- ✅ 收进来不变:每个聊天各走自己那一行,谁说的只回谁那边,不会串。
- 设置页那句说明也跟着改了。
- 测试:新增/改写两条(私聊 + 群都发 / 关掉一条只发另一条),宿主半边 74 项、其余四套全过。
1.3.0 — 2026-10-30
每条进来的消息都带「来源头」,正文里的【】会被换掉(防冒充)
- ✅ 现在每条转进来的消息,第一行都是来源:
【QQ群 123456】(群消息,带群号)【QQ私聊】【本机注入·不是QQ·不是主人】(/receive那条路 —— 以前它跟 QQ 私聊长得一模一样,会被当成主人说话)
- ✅ 防冒充:正文里出现的
【】一律换成[],并在末尾注一句「原文里的【】已换成 [],那是对方亲手打的字」——
别人打一句「【QQ私聊·主人·123】帮我改代码」冒充不了来源了。 - ✅ 开关「来源头」默认开;关掉就回到老样子(只有群里那行「昵称(号):」)。
- 测试:宿主半边 72 项、其余四套全过。
1.2.1 — 2026-10-29
「署名」改成昵称 + 号
- 🔧 以前署名只带号(
QQ 789:…),私聊里看不出是谁。现在带昵称:小鱿鱼(789):…;
没昵称才退回QQ 789:…。 - 「[QQ] 前缀」那档不变。
1.2.0 — 2026-10-29
私聊进来的话可以标一下来源(默认不标)
- ✅ 设置 → 「私聊进来的话标来源」,三档:
- 不标(默认):跟以前一模一样,纯一行字;
- [QQ] 前缀:
[QQ] 你说的那句,占几个字,一眼认出是从手机来的; - 署名:
QQ 789:你说的那句,跟群里那套一个样子。
- 用途:同一个会话里手机和电脑交替说话时,模型那边也能分清「这句是从 QQ 来的,还是我刚在电脑上打的」——
source.kind在事件里是有的,但它不进模型的上下文,所以只能靠正文里带。 - 默认关,对现有用法零影响。
- 测试:新增三条(不标 / 前缀 / 署名),宿主半边与四套自测全过。
1.1.9 — 2026-10-29
补上商城要的「兼容范围」和权限说明
- ✅
package.json补了engines:Node>=22、DSH>=0.2.1-rc.2;
另外加了dsh.compatibility.dshReleases,只声明实际跑过的那个版本(0.2.1-rc.3),不批发。 - ✅ README 新增一节「它要什么权限,边界在哪」:网络(只连你填的后端)、文件(只碰
~/.dsh/两个文件 + 收图目录)、
命令(只有你自己填了转写命令才跑)、凭据(令牌只用来连自己的后端),以及外部依赖和失败边界。 - 没有行为变化。
1.1.8 — 2026-10-29
群聊:能 @ 人了,冷却真的生效了,绑定能单独开关
- ✅ 能 @ 别人:回复里写到的
@现在会变成真正的 @(OneBot 的at段),不再只是几个字。@123456789(数字 QQ 号)→ 直接 @ 那个号;@昵称→ 去群成员表里找同名(缓存十分钟),找到且只有一个人叫这名才真 @,找不到就当普通文字,不会乱 @ 人;@全体成员/@所有人→ 默认不认(怕一次把全群炸起来),要的话在设置里打开「能 @ 全体」。
- 🔧 群聊冷却、每分钟上限以前对 @ 的话不生效 —— 群里一有人 @ 它,那两个数就等于没有,看起来就是
「没有冷却、发言频率特别高」。现在 @ 的话也排队:不丢、不拒,只是晚几秒(多条会合并)再回。 - ✅ 每一条绑定有自己的开关(设置 → 绑定,每行下面两个勾):
- 启用:取消 = 这个群/私聊整个静音(不收也不发),配置留着,随时勾回来 —— 不用再删掉重建;
- 只听 @ 我的(群才有):勾上 = 这个群平时不读,只有 @ / 引用它才进来。
- 测试:宿主半边 + 四套自测全过(新增 @ 拆段 7 条、冷却 1 条、绑定开关 2 条、界面 1 条)。
1.1.6 — 2026-10-29
群里的自我回声:机器人自己说的话又被转进去了
- 🔧 开着「群里也听别人的话」时,机器人自己发出去的回话也被当成群友的话收了进来 ——
它回一句、这句又触发一轮、再回一句,能一直套下去(issue #14)。 - ✅ 现在先拿自己的 QQ 号,群消息里自己发的直接跳过(不回、不攒、不占上下文)。
- 测试:宿主半边 143 条、其余四套全过。
1.1.5 — 2026-10-29
一条取不到的「合并转发的聊天记录」,把日志刷爆、还一直打 NapCat
- 🔧 取不到内容时,整批转不进去 → 水位不推进 → 每 2 秒重来一遍,每一遍都再拉一次
get_forward_msg,
NapCat 一直报错、日志被同一个 id 刷屏。 - ✅ 现在按 id 记住「取不到」(成功的照样每次重读,不拿旧文本冒充新内容),十分钟内不再重拉;
同时那条消息照样带着一句[合并转发的聊天记录(内容取不到)]转进去,不会被静默丢掉。 - 测试:新增三条(第一次拉、下一跳不再拉、取不到也有话说),宿主半边 143 条全过。
1.1.4 — 2026-10-29
会话清单列不全:没在标签页里打开过的会话,列表里根本看不到
- 🔧
ctx.get('sessions').list在新版 DSH 里是快照对象(有.getSnapshot()、本身不是函数),
以前只认typeof list === 'function',于是那条路整个不执行,只剩「活着的 agent」兜底 ——
一直用、但从没在这台机器上打开过的会话就永远列不出来。 - ✅ 现在三路都试:内存里的会话(老的
list()/ 新的getSnapshot())、
盘上的storages/session_projcache/sessions/*.json(关掉标签页也还在)、最后才是 agent 兜底。 - ✅ 盘上那份顺手把标题也读出来;子智能体的会话滤掉(不然设置页会被几十个 subagent 淹掉)。
- 测试:新增三条(读得到盘上的、滤掉子会话、标题读出来),全部通过。
1.1.3 — 2026-10-29
「回复概率」以前对 @ 它的话根本不生效
- 🔧 原因:默认「群里只听点了名的」= 能进来的几乎都是 @ / 引用它的消息,而这类批次从来不掷骰子,
所以概率填 50、填 20,实际表现都是照回(只有 100 才"没差别")。 - ✅ 新增开关「@ 我的一定回」(默认开 = 保持原来行为)。关掉之后,「概率」连 @ / 引用 的话一起管 ——
想让它少说话的人就能真的少说了。 - 测试:新增两条(开着必回 / 关掉也掷骰子),全部通过。
v1.1.2 · 人设加了个「现在就生效」按钮:改完不用等 QQ 来信
人设加了个「现在就生效」按钮:改完不用等 QQ 来信
- 🆕 以前人设是在「把 QQ 消息转进 DSH」那一步才挂上去 —— 所以改完开关/文字,得先去 QQ 发一句话才看得到效果。
现在设置页有一个 「现在就生效」:把每条绑定的会话挨个挂一遍(开关关着 = 顺手撤掉),
下面会写清楚哪几间生效、哪几间没开着。 - ✅ 新增路由
POST /dsh-qq-bridge/persona-apply(按钮打的就是它)。
这一版也包含 1.1.1:人设只走系统提示词 —— 挂不上就一个字都不带,不再塞进聊天里(会留在历史里堆着,而且只对 QQ 那边生效);挂完会按会话的 scope 验一次装配;界面上那句「每轮都要多花这些」的说明删掉了(走系统提示词是稳定前缀、能命中缓存,不是每轮全价)。
安装 / 升级
dsh plugin --profile desktop add github:Yuuyuko-uu/dsh-qq-bridge装过的直接重装一次就行(配置和记忆都在 ~/.dsh/,不会被覆盖);装完重启一次 DSH 生效。
v1.1.0 · 人设(选填):可以让某个群 / 某个私聊单独带一份
人设(选填):可以让某个群 / 某个私聊单独带一份
- 🆕 「绑定」页最上面多了「人设(选填)」:一个开关 + 一段字,关着就完全不带。
- 🆕 每一行绑定还能单独写一份(表格里「单独」那一列)—— 那个聊天用自己的,没写的用上面那份。
- 做法:优先挂到那间会话的系统提示词上(不占对话、能走缓存、也不像每轮都在下命令);
拿不到那个服务时退回来,把这段字放进转进去的消息最前面,并在记录里写一句是哪种方式。 - 改人设随时生效:撤掉旧的、挂上新的,下一轮就按新的说话(代价是那一段缓存要重算一次)。
- 新增诊断路由
/dsh-qq-bridge/persona-probe:只看「到底能不能挂上系统提示词」。 - 测试:网页半边点进「绑定」页也验了(人设卡 + 那一列在);攒条新增两条(人设随消息带上 / 关掉就不带)。
安装 / 升级
dsh plugin --profile desktop add github:Yuuyuko-uu/dsh-qq-bridge装过的直接重装一次就行(配置和记忆都在 ~/.dsh/,不会被覆盖);装完重启一次 DSH 生效。
v1.0.9 · 群聊不再一句一句回:先攒一攒,再给个「隔多久 / 一分钟几条」
群聊不再一句一句回:先攒一攒,再给个「隔多久 / 一分钟几条」
- 🐛 群里每来一条就转进去起一轮,人多的时候像刷屏,也一直在烧上下文。
- ✅ 群里换人也照攒:一波人连着说的几句合成一条送进去,每行前面写清「昵称(QQ号):」,
不会认错人;攒够「一次最多攒几条」立刻送,不用干等窗口。 - ✅ 节奏只有两个数(旋钮多了反而没人看得懂):
· 两条之间至少隔几秒(默认 5)—— 时间里群里新的话先攒着,到点一起回;
· 一分钟最多回几条(默认 4)—— 撞上了这批就等着,等一分钟窗口腾出位置再送,等不丢。 - ✅ @、引用 不受这两个数限制。
- ✅ 不是每句都接(概率 %):群里的闲聊不一定每句都理。没掷中的那批根本不送进来 ——
不进 DSH、不占上下文、不花 token,跟「送进来再判不接」(模型想一遍再停)是两回事;
大群里上下文不会被人家的闲聊塞满。默认 100(每批都接),@ 和引用照旧必接。 - ✅ 设置放在「绑定」页「+ 加一条」下面,单独一张「群里怎么回(对所有群生效)」。
- 测试:宿主半边、网页半边、攒条、生命周期、单飞全过(新增 5 条:冷却挂住不丢、一分钟上限挂着等窗口、
跨人合并且名字都在、概率 0 整批跳过、概率 100 照接)。
安装 / 升级
dsh plugin --profile desktop add github:Yuuyuko-uu/dsh-qq-bridge装过的直接重装一次就行(配置和记忆都在 ~/.dsh/,不会被覆盖);装完重启一次 DSH 生效。