@fengye_nobug/dsh-qq-bot 0.2.8 → 0.2.9
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 +4 -0
- package/DESIGN.md +1 -1
- package/README.md +1 -0
- package/index.js +19 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
+
## v0.2.9 — 2026-11-02
|
|
4
|
+
|
|
5
|
+
- **每个会话的轮数上限会真正压缩**:`maxRecentTurns`(默认 40,填 0 不限制)在 QQ 叫醒的一轮结束后,会请宿主把更早的内容压掉。以前这次调用少传了宿主要求的取消信号,压缩还没开始就失败,失败只留在日志里,会话仍会一直变长。现在会等这一轮结束并空闲下来,再按宿主的参数去压缩。宿主没有压缩能力时仍然跳过,不影响收发。
|
|
6
|
+
|
|
3
7
|
## 0.2.8
|
|
4
8
|
|
|
5
9
|
- 设置卡片:群白名单在连上 NapCat 时可显示群名和头像;查不到时仍只显示群号
|
package/DESIGN.md
CHANGED
|
@@ -603,7 +603,7 @@ QQ 的“拍一拍”在 OneBot 里走的是 **notice 事件**,不是消息段
|
|
|
603
603
|
|---|---|---|
|
|
604
604
|
| `targetSessionId` | `''` | 接到哪个会话。`single` 时**空 = 不接到任何会话**。`perGroup` 时可以留空(新建会话用宿主当前默认模型);填了则新建会话沿用该会话的模型 |
|
|
605
605
|
| `sessionScope` | `single` | 会话怎么分。`single` = 所有群共用一个会话;`perGroup` = 每个群、每个私聊各记各的,映射写在状态文件的 `sessionByDest`(键为 `group:<群号>` / `private:<QQ号>`)。新建会话带工作目录和「QQ群 / QQ私聊」标题,见 [README 的功能](./README.md#功能) |
|
|
606
|
-
| `maxRecentTurns` | `40` |
|
|
606
|
+
| `maxRecentTurns` | `40` | 每个会话最多留几轮。超出后,等这一轮回到空闲,再调用宿主 `compaction.compactNow(agent, signal)` 尽量压缩。`signal` 是未取消的 AbortSignal,不传命令 id。有投影时看投影轮数。压完没变短就停。`0` = 不限制。compaction 不在 inject 里,宿主没有这项服务时跳过 |
|
|
607
607
|
| `nicknames` | `['244','小助手']` | 听到这些名字就回应 |
|
|
608
608
|
| `wakeProbability` | `0.05` | 没点名时的回应概率 |
|
|
609
609
|
| `whitelist` / `groupWhitelist` | `[]` | 哪些私聊可以叫醒 / 哪些群可以叫醒(**留空 = 谁都不能叫醒**)。群白名单在卡片里按群号填;连上且查到群名时,群号旁边显示当前群名和头像,查不到或没连上只显示群号,不影响保存 |
|
package/README.md
CHANGED
|
@@ -62,6 +62,7 @@ DSH 0.2 的卡片把值写进 `$DSH_HOME/qq-bridge-settings.json`。这份文件
|
|
|
62
62
|
|---|---|---|
|
|
63
63
|
| `targetSessionId` | 空 | `single` 时接到哪个会话。留空 = 不接到任何会话 |
|
|
64
64
|
| `sessionScope` | `single` | `perGroup` 时每个群、每个私聊各一条会话 |
|
|
65
|
+
| `maxRecentTurns` | `40` | 每个会话最多留几轮。QQ 一轮结束后,更早的内容会尽量压缩掉。`0` = 不限制 |
|
|
65
66
|
| `nicknames` | `244`、`小助手` | 听到这些名字就叫醒 |
|
|
66
67
|
| `wakeProbability` | `0.05` | 没点名时的叫醒概率 |
|
|
67
68
|
| `whitelist` | `[]` | 哪些私聊可以叫醒。留空 = 都不叫醒 |
|
package/index.js
CHANGED
|
@@ -1902,12 +1902,30 @@ export function apply(ctx, config) {
|
|
|
1902
1902
|
/**
|
|
1903
1903
|
* QQ 驱动的一轮结束后,把该会话压到 maxRecentTurns。
|
|
1904
1904
|
* 0 或宿主没有 compaction 时什么都不做。压缩失败只记日志,不挡出站。
|
|
1905
|
+
*
|
|
1906
|
+
* compaction 不放进 inject。它是可选服务:宿主没装压缩时,桥仍要收发 QQ。
|
|
1907
|
+
* `ctx.get` 不要求 inject;没有这项服务时返回 undefined。
|
|
1908
|
+
*
|
|
1909
|
+
* 宿主 `compactNow(agent, signal, sourceCommandId?)` 会立刻 `signal.throwIfAborted()`。
|
|
1910
|
+
* 官方 `/compact` 传的是这次命令的 signal 和 commandId。这里没有命令,传一个未中止的
|
|
1911
|
+
* AbortSignal,不传 sourceCommandId。少传 signal 会在写入 compaction 事件之前抛错。
|
|
1912
|
+
*
|
|
1913
|
+
* `turn/end` 写入日志时,驱动还占着 running。这时调用会在 `runMaintenance` 上失败,
|
|
1914
|
+
* 同样写不出 compaction 事件。先等 `whenIdle`。旧宿主没有这个方法时让出一个宏任务
|
|
1915
|
+
* (微任务会排在驱动回到 idle 之前)。
|
|
1905
1916
|
*/
|
|
1906
1917
|
async function maybeTrimSession(agent) {
|
|
1907
1918
|
const max = readSettings().maxRecentTurns
|
|
1908
1919
|
if (!max || max <= 0 || !agent) return
|
|
1909
1920
|
const compaction = ctx.get('compaction')
|
|
1910
1921
|
if (!compaction || typeof compaction.compactNow !== 'function') return
|
|
1922
|
+
try {
|
|
1923
|
+
if (typeof agent.whenIdle === 'function') await agent.whenIdle()
|
|
1924
|
+
else await new Promise((resolve) => setTimeout(resolve, 0))
|
|
1925
|
+
} catch (error) {
|
|
1926
|
+
logger.warn(`compact trim skipped: ${error?.message ?? error}`)
|
|
1927
|
+
return
|
|
1928
|
+
}
|
|
1911
1929
|
const countTurns = () => {
|
|
1912
1930
|
// 投影里的轮次是压缩之后还留着的。历史事件里的 turn/end 压不掉,先数它会一直超限。
|
|
1913
1931
|
try {
|
|
@@ -1938,7 +1956,7 @@ export function apply(ctx, config) {
|
|
|
1938
1956
|
}
|
|
1939
1957
|
previous = turns
|
|
1940
1958
|
try {
|
|
1941
|
-
const result = await compaction.compactNow(agent)
|
|
1959
|
+
const result = await compaction.compactNow(agent, new AbortController().signal)
|
|
1942
1960
|
if (!result) return
|
|
1943
1961
|
logger.info(`session ${agent.session?.id ?? agent.id} trimmed via compact (turns~${turns} > ${max})`)
|
|
1944
1962
|
} catch (error) {
|
package/package.json
CHANGED