Skip to content

Releases: Yuuyuko-uu/dsh-qq-link

v1.4.6

Choose a tag to compare

@Yuuyuko-uu Yuuyuko-uu released this 31 Oct 17:59

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

Choose a tag to compare

@Yuuyuko-uu Yuuyuko-uu released this 31 Oct 13:10

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

Choose a tag to compare

@Yuuyuko-uu Yuuyuko-uu released this 31 Oct 12:39

1.4.4 — 2026-10-31

「按句子拆」存不住;正文里叫名字也能算点名;「只回 QQ 唤醒」不再一刀切

① 「按句子拆」勾上、保存,自己弹回去

  • 🐞 1.4.3 给这个开关加了界面、加了默认值、也加了业务逻辑,唯独漏在归一化的字段白名单里。
    归一化会把不认识的字段直接扔掉,于是:勾上 → 保存 → 后端回一份没有这个字段的配置 →
    前端拿返回值一覆盖,勾就变回空的;磁盘上的配置文件里也从来没有这一项。
  • ✅ 补进白名单;另加两条测试(开着、关掉,都能存住)。

② 正文里直接叫名字,也算点名

  • ✅ 新增「正文里叫这些名字也算点名」。多个用逗号或空格隔开,留空 = 关着(跟以前一样)。
  • 以前群里只认 @ 和引用;有人直接说「让它帮我干活」「去问问它」,既没 @ 也没引用,
    只能靠「回复概率」掷骰子,大概率被丢掉 —— 而人看到的是「名字被叫了却没回应」,
    很难想到是概率拦的。
  • 这一项同样放进白名单(不会再犯上面那个错)。

③ 「只回 QQ 唤醒」不再一刀切

  • 🐞 以前这道闸的判据是「最近十分钟内有没有 QQ 消息进来」,于是自动触发的轮次
    (主动搭话、到点刷 B 站)也一起被挡了 —— 它们根本不是「你在窗口里自己聊」。
  • ✅ 现在按这一轮的来源(source.kind)分开看:
    · 你自己在 DSH 窗口里打的字 → 一律留在本地(这才是「只回 QQ 唤醒」本来要挡的东西)
    · QQ 转进来的 → 照常发
    · 自动触发的 → 看下面那个新开关
  • ✅ 新增「自动触发的也发(主动搭话 / 定时任务)」,默认关,老用户行为完全不变;
    开了之后那几轮也会推到手机。
  • 自测:宿主半边全过。

v1.4.3

Choose a tag to compare

@Yuuyuko-uu Yuuyuko-uu released this 30 Oct 14:39

1.4.3 — 2026-10-30

群里「只听点名」管不住自己发的话;长回复拆成一条条;人设的三个坑

① 「只听点名」现在对群里所有人生效

  • 🐞 以前有一条捷径:自己(绑定的那个私聊号)在群里说的话会绕过点名过滤,直接收进来。
    于是在群里随手发点东西(地址、key、别处的聊天记录),也会被当成「对着它说」。
  • ✅ 现在「只听点名」一开,群里任何人(包括自己)都要 @ 或引用才收。
  • ✅ 新增每行一个 「不受点名限制的 QQ」 名单:填进去的号不用点名也直接收
    (但不算点名 —— 不触发「点名必回」,也不消耗「点名之后接着听」的条数)。
    逗号/空格/中文逗号/顿号/分号/换行都能分,写几个都行,默认空。

② 长回复可以按句子拆(默认关)

  • 🆕 配置 按句拆:开着时按句末标点切(。!?;… 和 .!?;),一句一条,像人一条条打字。
  • 规则做得保守:连续标点(?!、……)算一处不重复切;标点后紧跟的右引号/右括号留在这一句;
    括号里的标点不算断句(不然一句话被切成两半);空行照样是硬边界。
  • 默认关 —— 老用户升级后行为一点不变。设置页在「发出去的样子」那一栏。

③ 人设三处

  • 🐞 2000 字上限静默截断:设置读入和挂载时都 .slice(0, 2000),超出的部分直接没了、界面上也没提示。
    现在上限放到 2 万字(只做保护,不再悄悄砍)。

  • 🐞 只在收到 QQ 消息时挂载:Harness 重启之后,如果第一个回合是定时任务 / 主动搭话触发的,
    那一轮就没有人设。现在跟着心跳每跳补一次(同一个 agent、同一段文本会秒返回)。

  • 🐞 会话实例替换后不重新挂:缓存只比「文本变没变」,会话被恢复成新实例之后文本没变,
    就判定「已经挂上了」直接返回,人设其实没挂到新会话上。现在缓存认 agent 实例。

  • 自测:宿主半边 218 项、网页半边全过。

v1.4.2

Choose a tag to compare

@Yuuyuko-uu Yuuyuko-uu released this 30 Oct 12:23

1.4.2 — 2026-10-30

装不上 / 看不懂日志的两处小坑

  • ✅ README 的安装那节补了一条不用 git 的装法:github: 那种写法会让包管理器去 clone 仓库,
    机器上没装 git 就会报 ERR_PNPM_GIT_FETCH_FAILED;改用 tarball 直链就能装。
  • ✅ 「补投窗口」跳过老消息时,日志后面补了一句「想看内容可以回 QQ 里翻聊天记录」——
    以前只写「这条已经是 1165 分钟前的了,不再补投」,用户看着像消息丢了。

v1.4.1

Choose a tag to compare

@Yuuyuko-uu Yuuyuko-uu released this 30 Oct 05:06

1.4.1 — 2026-10-30

被点名之后会接着听几句;能看 QQ 空间、能发说说

  • ✅ 群里默认「只听点名」时,被 @ 或引用之后,同一个群里后面紧跟着的普通消息也会转进来:
    接够「点名后接听条」就停,或者过了「点名后接听秒」就停,然后退回「只听点名」。
    • 两项新配置:「点名后接听条」默认 5(范围 0~50,0 = 关掉这个功能,回到老行为)、
      「点名后接听秒」默认 120(范围 0~600);设置页在「提示与门槛」。
    • 状态按聊天(群号)分开记:一个群在接听,不影响别的群;私聊完全不受影响。
    • 接听中进来的话不算点名,不会把条数又重置一遍,也不影响「点名必回」那套判定。
    • 「该不该放进来」抽成了纯函数 该收这条(导出,单测直接喂)。
  • ✅ 新增四个工具(挂在绑了 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

Choose a tag to compare

@Yuuyuko-uu Yuuyuko-uu released this 29 Oct 15:05

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 来信

Choose a tag to compare

@Yuuyuko-uu Yuuyuko-uu released this 28 Oct 02:59

人设加了个「现在就生效」按钮:改完不用等 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 · 人设(选填):可以让某个群 / 某个私聊单独带一份

Choose a tag to compare

@Yuuyuko-uu Yuuyuko-uu released this 28 Oct 02:34

人设(选填):可以让某个群 / 某个私聊单独带一份

  • 🆕 「绑定」页最上面多了「人设(选填)」:一个开关 + 一段字,关着就完全不带。
  • 🆕 每一行绑定还能单独写一份(表格里「单独」那一列)—— 那个聊天用自己的,没写的用上面那份。
  • 做法:优先挂到那间会话的系统提示词上(不占对话、能走缓存、也不像每轮都在下命令);
    拿不到那个服务时退回来,把这段字放进转进去的消息最前面,并在记录里写一句是哪种方式。
  • 改人设随时生效:撤掉旧的、挂上新的,下一轮就按新的说话(代价是那一段缓存要重算一次)。
  • 新增诊断路由 /dsh-qq-bridge/persona-probe:只看「到底能不能挂上系统提示词」。
  • 测试:网页半边点进「绑定」页也验了(人设卡 + 那一列在);攒条新增两条(人设随消息带上 / 关掉就不带)。

安装 / 升级

dsh plugin --profile desktop add github:Yuuyuko-uu/dsh-qq-bridge

装过的直接重装一次就行(配置和记忆都在 ~/.dsh/,不会被覆盖);装完重启一次 DSH 生效。

v1.0.9 · 群聊不再一句一句回:先攒一攒,再给个「隔多久 / 一分钟几条」

Choose a tag to compare

@Yuuyuko-uu Yuuyuko-uu released this 28 Oct 01:44

群聊不再一句一句回:先攒一攒,再给个「隔多久 / 一分钟几条」

  • 🐛 群里每来一条就转进去起一轮,人多的时候像刷屏,也一直在烧上下文。
  • ✅ 群里换人也照攒:一波人连着说的几句合成一条送进去,每行前面写清「昵称(QQ号):」,
    不会认错人;攒够「一次最多攒几条」立刻送,不用干等窗口。
  • ✅ 节奏只有两个数(旋钮多了反而没人看得懂):
    · 两条之间至少隔几秒(默认 5)—— 时间里群里新的话先攒着,到点一起回;
    · 一分钟最多回几条(默认 4)—— 撞上了这批就等着,等一分钟窗口腾出位置再送,等不丢。
  • ✅ @、引用 不受这两个数限制。
  • ✅ 不是每句都接(概率 %):群里的闲聊不一定每句都理。没掷中的那批根本不送进来 ——
    不进 DSH、不占上下文、不花 token,跟「送进来再判不接」(模型想一遍再停)是两回事;
    大群里上下文不会被人家的闲聊塞满。默认 100(每批都接),@ 和引用照旧必接。
  • ✅ 设置放在「绑定」页「+ 加一条」下面,单独一张「群里怎么回(对所有群生效)」。
  • 测试:宿主半边、网页半边、攒条、生命周期、单飞全过(新增 5 条:冷却挂住不丢、一分钟上限挂着等窗口、
    跨人合并且名字都在、概率 0 整批跳过、概率 100 照接)。

安装 / 升级

dsh plugin --profile desktop add github:Yuuyuko-uu/dsh-qq-bridge

装过的直接重装一次就行(配置和记忆都在 ~/.dsh/,不会被覆盖);装完重启一次 DSH 生效。