@fengye_nobug/dsh-qq-bot 0.2.11 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # 更新日志
2
2
 
3
+ ## v0.2.12 — 2026-11-02
4
+
5
+ - **QQ 回复风格不再鼓励使用 emoji**:`$DSH_HOME/.agent-presets/dsh-qq-bridge/skills/qq-session-reply-style/references/reply-style.md` 若还写着 “Emoji are welcome when they make the answer friendlier.”,插件启动时删掉这一句。「Avoid Markdown formatting. Use plain text.」以及前后其它行保持原样。不另加「默认不要带表情」或「少用某个表情」的规矩。这份文件不在插件目录里,DSH 升级时也不会改写 `.agent-presets`;它是人设安装时复制进去的。面板更新并重启后才会改到磁盘上的那一份。文件本来就不存在时不会新建,也不用删掉整个人设目录。用法说明和 `qq_bridge_send` 的说明不动。
6
+
3
7
  ## v0.2.11 — 2026-11-02
4
8
 
5
9
  - **轮数上限会用到人设里的压缩**:`maxRecentTurns`(默认 40,填 0 不限制)在 QQ 叫醒的一轮结束并空闲后,压缩更早的内容。标准人设把压缩放在隔离域里,插件所在的宿主上下文看不见,所以 0.2.9 这次调用直接跳过,会话会一直变长,日志里也没有压缩记录。现在先向这条会话的人设要压缩服务,没有再看会话作用域和宿主。已经超限却找不到,或这次压缩没有改动会话时,记一条警告。仍然等这一轮空闲,并带上未取消的取消信号。不必在宿主配置里再打开压缩。哪一层都没有压缩时不影响收发。
package/DESIGN.md CHANGED
@@ -194,6 +194,8 @@ qq_bridge_napcat
194
194
 
195
195
  四条路。装完都要让 dsh-web 重新加载插件:
196
196
 
197
+ 0.2.12 起,插件启动时会看 `$DSH_HOME/.agent-presets/dsh-qq-bridge/skills/qq-session-reply-style/references/reply-style.md`。里面若还有 “Emoji are welcome when they make the answer friendlier.”,只删这一句。这文件不在 npm 包的安装目录里,`dsh plugin add` 不会顺手改它;人设安装时整份复制到 `$DSH_HOME/.agent-presets`,所以要等新版本的插件进程起来才写回。文件不存在就不创建。不要为了这句话删掉整个人设目录,本插件不会把人设的其它文件补回去。
198
+
197
199
  1. 设置卡片里先点「检查更新」。有新正式版时出现「更新到 vX.Y.Z」。点下去优先执行 `dsh plugin --profile web add @fengye_nobug/dsh-qq-bot@X.Y.Z`,走这台机器上 pnpm 已经配置的 registry,然后重启面板。装完会把 profile、`$DSH_HOME/cordis.patch.yml`(写了 `qq-bridge` 才改)和插件补丁里 `qq-bridge` 的 `name` 改成磁盘上的包名,`config` 不动。设置还在,不改 NapCat。重启后刷新页面;登录口令可能会变。
198
200
  2. 自己执行同一条命令。npm 上已经发出的是 `@fengye_nobug/dsh-qq-bot@0.2.5`。自己装不会自动改 profile 里的旧 `name`。
199
201
  3. 指定 GitHub tag:`dsh plugin --profile web add github:yunfengnobug/dsh-qq-bot#vX.Y.Z`
package/README.md CHANGED
@@ -96,6 +96,8 @@ DSH 0.2 的卡片把值写进 `$DSH_HOME/qq-bridge-settings.json`。这份文件
96
96
 
97
97
  设置卡片里先点「检查更新」。有新正式版时点「更新到 vX.Y.Z」。优先从 npm 安装;这一版还没发到 npm 时,改从 GitHub 下载。装完会自己重启 dsh-web。设置还在,不改 NapCat。刷新页面后,登录口令可能会变。
98
98
 
99
+ 0.2.12 起,重启后如果 `$DSH_HOME/.agent-presets/dsh-qq-bridge/skills/qq-session-reply-style/references/reply-style.md` 里还有 “Emoji are welcome when they make the answer friendlier.”,会删掉这一句。「Avoid Markdown formatting. Use plain text.」还在,其它行不动,也不另写禁用表情的规矩。这份文件本来没有时不会新建。不用删掉整个人设目录。已经读进当前会话的旧规则,要等下次再读这份说明,或另开一条会话。
100
+
99
101
  「检查更新」和「启动时检查一次」只询问,不会安装。
100
102
 
101
103
  维护者发版:
@@ -0,0 +1,8 @@
1
+ # Reply Style
2
+
3
+ Use these rules when replying through QQ:
4
+
5
+ 1. Put the conclusion first.
6
+ 2. Keep the reply concise.
7
+ 3. Avoid Markdown formatting. Use plain text.
8
+ 4. If you changed files during this conversation, list only the modified file names with a brief note for each.
package/index.js CHANGED
@@ -42,6 +42,7 @@ import {
42
42
  upsertSticker,
43
43
  } from './stickers.js'
44
44
  import { FACE_NAME_TO_ID, textToOneBotSegments } from './faces.js'
45
+ import { syncInstalledReplyStyle } from './reply-style.js'
45
46
  import { applyPluginUpdate, checkPluginUpdate } from './updates.js'
46
47
 
47
48
  const require = createRequire(import.meta.url)
@@ -726,6 +727,14 @@ export function apply(ctx, config) {
726
727
  const legacySettings = hasLegacySettings(settingsService)
727
728
 
728
729
  const home = process.env.DSH_HOME || join(homedir(), '.dsh')
730
+ // 人设文件在 $DSH_HOME/.agent-presets,不随 node_modules 一起换。
731
+ // 面板升级并重启后,这里只删掉已经复制进去的那句鼓励使用 emoji 的话。
732
+ try {
733
+ const refreshed = syncInstalledReplyStyle(home)
734
+ if (refreshed.changed) logger.info('已去掉 QQ 回复风格里鼓励使用 emoji 的那一句。')
735
+ } catch (error) {
736
+ logger.warn(`更新 QQ 回复风格失败:${error?.message ?? error}`)
737
+ }
729
738
  /**
730
739
  * 用户设置的落盘位置(0.2.0 专用)。
731
740
  * 0.2.0 的宿主设置桥不给第三方插件可写域(见 docs/dsh-0.2.0-migration.md),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fengye_nobug/dsh-qq-bot",
3
- "version": "0.2.11",
3
+ "version": "0.2.12",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "description": "把 DSH 会话接到 QQ(OneBot/NapCat)的插件。白名单默认全关;被 @、叫到昵称或被戳一定叫醒,其余消息按可调概率抽样。Fork 自 sj244/dsh-qq-bridge(MIT)。",
@@ -57,6 +57,8 @@
57
57
  "napcat.js",
58
58
  "stickers.js",
59
59
  "faces.js",
60
+ "reply-style.js",
61
+ "agent-presets",
60
62
  "client",
61
63
  "assets",
62
64
  "screenshots.json",
package/reply-style.js ADDED
@@ -0,0 +1,60 @@
1
+ // 已装上的 QQ 人设不在插件目录里。
2
+ // DSH 升级插件时只换 node_modules,不会改写 $DSH_HOME/.agent-presets。
3
+ // reply-style.md 是人设安装时复制进去的。插件每次启动时,如果那份文件还在鼓励使用 emoji,
4
+ // 就只删这一句。其它行保持原样。人设目录或这份文件不存在时,不新建。
5
+
6
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs'
7
+ import { isAbsolute, join } from 'node:path'
8
+ import { fileURLToPath } from 'node:url'
9
+
10
+ /** 磁盘上的相对路径,挂在 $DSH_HOME 下面。 */
11
+ export const INSTALLED_REPLY_STYLE_SEGMENTS = [
12
+ '.agent-presets',
13
+ 'dsh-qq-bridge',
14
+ 'skills',
15
+ 'qq-session-reply-style',
16
+ 'references',
17
+ 'reply-style.md',
18
+ ]
19
+
20
+ /** 要删掉的那一句。前后其它文字不动。 */
21
+ export const EMOJI_WELCOME_SENTENCE = 'Emoji are welcome when they make the answer friendlier.'
22
+
23
+ export function packagedReplyStylePath() {
24
+ return fileURLToPath(
25
+ new URL('./agent-presets/dsh-qq-bridge/skills/qq-session-reply-style/references/reply-style.md', import.meta.url),
26
+ )
27
+ }
28
+
29
+ export function installedReplyStylePath(home) {
30
+ return join(home, ...INSTALLED_REPLY_STYLE_SEGMENTS)
31
+ }
32
+
33
+ /**
34
+ * 去掉鼓励使用 emoji 的那一句,以及它前面紧挨着的空格或制表符。
35
+ * 不改其它字符,也不另加规矩。
36
+ */
37
+ export function stripEmojiEncouragement(text) {
38
+ return String(text ?? '').replaceAll(` ${EMOJI_WELCOME_SENTENCE}`, '').replaceAll(EMOJI_WELCOME_SENTENCE, '')
39
+ }
40
+
41
+ /**
42
+ * 启动时刷新已经复制到 $DSH_HOME 的回复风格。
43
+ * 文件不在就不创建;没有那一句就原样留下。
44
+ * @returns {{ changed: boolean, path: string, reason: 'bad-home' | 'missing' | 'unchanged' | 'stripped' }}
45
+ */
46
+ export function syncInstalledReplyStyle(home) {
47
+ if (typeof home !== 'string' || !isAbsolute(home)) {
48
+ return { changed: false, path: '', reason: 'bad-home' }
49
+ }
50
+ const target = installedReplyStylePath(home)
51
+ if (!existsSync(target)) return { changed: false, path: target, reason: 'missing' }
52
+ const current = readFileSync(target, 'utf8')
53
+ if (!current.includes(EMOJI_WELCOME_SENTENCE)) {
54
+ return { changed: false, path: target, reason: 'unchanged' }
55
+ }
56
+ const next = stripEmojiEncouragement(current)
57
+ if (next === current) return { changed: false, path: target, reason: 'unchanged' }
58
+ writeFileSync(target, next)
59
+ return { changed: true, path: target, reason: 'stripped' }
60
+ }