@aalis/plugin-adapter-onebot 0.10.1 → 0.11.0
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/dist/attachment-cache.d.ts +7 -16
- package/dist/attachment-cache.d.ts.map +1 -1
- package/dist/attachment-cache.js +33 -4
- package/dist/attachment-cache.js.map +1 -1
- package/dist/forward-expand.d.ts +6 -2
- package/dist/forward-expand.d.ts.map +1 -1
- package/dist/forward-expand.js +68 -19
- package/dist/forward-expand.js.map +1 -1
- package/dist/forward.d.ts +21 -9
- package/dist/forward.d.ts.map +1 -1
- package/dist/forward.js +106 -131
- package/dist/forward.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -35
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/forward.js
CHANGED
|
@@ -12,90 +12,57 @@
|
|
|
12
12
|
* onebot_get_forward_msg 工具 / 缓存命中拿回。
|
|
13
13
|
*
|
|
14
14
|
* 本模块仅做"纯逻辑",不直接依赖 Context;适配器通过依赖注入提供
|
|
15
|
-
* fetchForward /
|
|
15
|
+
* fetchForward / resolveMedia / summarize 三个能力函数。
|
|
16
16
|
*/
|
|
17
17
|
import { getForwardNodes } from './types.js';
|
|
18
|
+
/** 各媒体类的占位符与识别成功时的包装 */
|
|
19
|
+
const MEDIA_LABEL = {
|
|
20
|
+
image: { placeholder: '[图片]', prefix: '[图片: ', suffix: ']' },
|
|
21
|
+
audio: { placeholder: '[语音]', prefix: '[语音: ', suffix: ']' },
|
|
22
|
+
video: { placeholder: '[视频]', prefix: '[视频: ', suffix: ']' },
|
|
23
|
+
};
|
|
24
|
+
/** 解析 CQ 段参数体(`,k=v,k=v`),含 CQ 转义还原。 */
|
|
25
|
+
function parseCqParams(body) {
|
|
26
|
+
const params = {};
|
|
27
|
+
for (const part of body.replace(/^,/, '').split(',')) {
|
|
28
|
+
const eq = part.indexOf('=');
|
|
29
|
+
if (eq <= 0)
|
|
30
|
+
continue;
|
|
31
|
+
params[part.slice(0, eq)] = part
|
|
32
|
+
.slice(eq + 1)
|
|
33
|
+
.replace(/&/g, '&')
|
|
34
|
+
.replace(/[/g, '[')
|
|
35
|
+
.replace(/]/g, ']')
|
|
36
|
+
.replace(/,/g, ',');
|
|
37
|
+
}
|
|
38
|
+
return params;
|
|
39
|
+
}
|
|
18
40
|
/**
|
|
19
|
-
*
|
|
41
|
+
* 剥除 NUL:媒体 token 用 NUL 做哨兵,所有进入行文本的外部字符串(CQ 串、text 段、
|
|
42
|
+
* at/face/share/未知段、昵称)都必须过这道——剥掉后消息内容无法伪造/搬运 token
|
|
43
|
+
* (NUL 经 JSON \u0000 转义可达,非理论面)。
|
|
20
44
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const body = m[1] ?? '';
|
|
31
|
-
for (const part of body.replace(/^,/, '').split(',')) {
|
|
32
|
-
const eq = part.indexOf('=');
|
|
33
|
-
if (eq <= 0)
|
|
34
|
-
continue;
|
|
35
|
-
params[part.slice(0, eq)] = part
|
|
36
|
-
.slice(eq + 1)
|
|
37
|
-
.replace(/&/g, '&')
|
|
38
|
-
.replace(/[/g, '[')
|
|
39
|
-
.replace(/]/g, ']')
|
|
40
|
-
.replace(/,/g, ',');
|
|
41
|
-
}
|
|
42
|
-
const src = params.url || params.file;
|
|
43
|
-
if (!src)
|
|
44
|
-
return { raw: m[0], rendered: fallback };
|
|
45
|
-
try {
|
|
46
|
-
const desc = await recognizer(src);
|
|
47
|
-
return { raw: m[0], rendered: desc ? `${successPrefix}${desc}${successSuffix}` : fallback };
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return { raw: m[0], rendered: fallback };
|
|
51
|
-
}
|
|
52
|
-
}));
|
|
53
|
-
let out = text;
|
|
54
|
-
for (const r of replacements)
|
|
55
|
-
out = out.replace(r.raw, r.rendered);
|
|
56
|
-
return out;
|
|
45
|
+
function stripNul(s) {
|
|
46
|
+
return s.includes('\u0000') ? s.split('\u0000').join('') : s;
|
|
47
|
+
}
|
|
48
|
+
/** 把 CQ 字符串里 [CQ:<cqType>,...] 段交给收集器(登记任务或落占位符)。 */
|
|
49
|
+
function replaceCqMedia(text, cqType, kind, collect) {
|
|
50
|
+
return text.replace(new RegExp(`\\[CQ:${cqType}(,[^\\]]+)?\\]`, 'g'), (_m, body) => {
|
|
51
|
+
const params = parseCqParams(body ?? '');
|
|
52
|
+
return collect(kind, params.url || params.file);
|
|
53
|
+
});
|
|
57
54
|
}
|
|
58
|
-
/**
|
|
59
|
-
|
|
55
|
+
/**
|
|
56
|
+
* 渲染一个节点 content(消息段数组或 CQ 字符串)为纯文本。
|
|
57
|
+
* 媒体段(图片/语音/视频)经收集器登记为待识别任务并放 token——本函数是纯结构渲染,
|
|
58
|
+
* 不发生任何网络/模型等待,保证 walk 快速完成、媒体源被尽早收集。
|
|
59
|
+
*/
|
|
60
|
+
function renderNodeContent(content, collect) {
|
|
60
61
|
if (typeof content === 'string') {
|
|
61
|
-
// CQ 码字符串:用正则替换 image / face / at / reply
|
|
62
|
-
let out = content;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const matches = [...out.matchAll(/\[CQ:image,([^\]]+)\]/g)];
|
|
66
|
-
const replacements = await Promise.all(matches.map(async (m) => {
|
|
67
|
-
const params = {};
|
|
68
|
-
for (const part of m[1].split(',')) {
|
|
69
|
-
const eq = part.indexOf('=');
|
|
70
|
-
if (eq <= 0)
|
|
71
|
-
continue;
|
|
72
|
-
params[part.slice(0, eq)] = part
|
|
73
|
-
.slice(eq + 1)
|
|
74
|
-
.replace(/&/g, '&')
|
|
75
|
-
.replace(/[/g, '[')
|
|
76
|
-
.replace(/]/g, ']')
|
|
77
|
-
.replace(/,/g, ',');
|
|
78
|
-
}
|
|
79
|
-
const src = params.url || params.file;
|
|
80
|
-
if (!src)
|
|
81
|
-
return { raw: m[0], rendered: '[图片]' };
|
|
82
|
-
try {
|
|
83
|
-
const desc = await opts.recognizeImage(src);
|
|
84
|
-
return { raw: m[0], rendered: desc ? `[图片: ${desc}]` : '[图片]' };
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
return { raw: m[0], rendered: '[图片]' };
|
|
88
|
-
}
|
|
89
|
-
}));
|
|
90
|
-
for (const r of replacements)
|
|
91
|
-
out = out.replace(r.raw, r.rendered);
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
out = out.replace(/\[CQ:image[^\]]*\]/g, '[图片]');
|
|
95
|
-
}
|
|
96
|
-
// record / video CQ 段:参数里取 url/file,调对应识别回调
|
|
97
|
-
out = await replaceCqWithRecognizer(out, 'record', '[语音]', '[语音: ', ']', opts.audioRecognitionEnabled !== false ? opts.recognizeAudio : undefined);
|
|
98
|
-
out = await replaceCqWithRecognizer(out, 'video', '[视频]', '[视频: ', ']', opts.videoRecognitionEnabled !== false ? opts.recognizeVideo : undefined);
|
|
62
|
+
// CQ 码字符串:用正则替换 image / record / video / face / at / reply
|
|
63
|
+
let out = replaceCqMedia(stripNul(content), 'image', 'image', collect);
|
|
64
|
+
out = replaceCqMedia(out, 'record', 'audio', collect);
|
|
65
|
+
out = replaceCqMedia(out, 'video', 'video', collect);
|
|
99
66
|
return out
|
|
100
67
|
.replace(/\[CQ:face,[^\]]*id=(\d+)[^\]]*\]/g, '[表情:$1]')
|
|
101
68
|
.replace(/\[CQ:at,[^\]]*qq=([^,\]]+)[^\]]*\]/g, '<at id="$1">$1</at>')
|
|
@@ -112,70 +79,33 @@ async function renderNodeContent(content, opts) {
|
|
|
112
79
|
const data = s.data ?? {};
|
|
113
80
|
switch (s.type) {
|
|
114
81
|
case 'text':
|
|
115
|
-
parts.push(String(data.text ?? ''));
|
|
82
|
+
parts.push(stripNul(String(data.text ?? '')));
|
|
116
83
|
break;
|
|
117
|
-
case 'at':
|
|
118
|
-
|
|
84
|
+
case 'at': {
|
|
85
|
+
const qq = stripNul(String(data.qq ?? ''));
|
|
86
|
+
parts.push(data.qq === 'all' ? '<at>all</at>' : `<at id="${qq}">${qq}</at>`);
|
|
119
87
|
break;
|
|
88
|
+
}
|
|
120
89
|
case 'face':
|
|
121
|
-
parts.push(`[表情:${String(data.id ?? '')}]`);
|
|
90
|
+
parts.push(`[表情:${stripNul(String(data.id ?? ''))}]`);
|
|
122
91
|
break;
|
|
123
|
-
case 'image':
|
|
124
|
-
|
|
125
|
-
if (opts.imageRecognitionEnabled && opts.recognizeImage && src) {
|
|
126
|
-
try {
|
|
127
|
-
const desc = await opts.recognizeImage(src);
|
|
128
|
-
parts.push(desc ? `[图片: ${desc}]` : '[图片]');
|
|
129
|
-
}
|
|
130
|
-
catch {
|
|
131
|
-
parts.push('[图片]');
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
parts.push('[图片]');
|
|
136
|
-
}
|
|
92
|
+
case 'image':
|
|
93
|
+
parts.push(collect('image', (data.url ?? data.file)));
|
|
137
94
|
break;
|
|
138
|
-
}
|
|
139
95
|
case 'reply':
|
|
140
96
|
break;
|
|
141
97
|
case 'forward':
|
|
142
98
|
// 嵌套占位符,递归展开会在外层处理;这里先放标记,外层 expand 用 inline content 优先
|
|
143
99
|
parts.push(data.id ? `<<<NESTED_FORWARD:${String(data.id)}>>>` : '[合并转发]');
|
|
144
100
|
break;
|
|
145
|
-
case 'record':
|
|
146
|
-
|
|
147
|
-
if (opts.audioRecognitionEnabled !== false && opts.recognizeAudio && src) {
|
|
148
|
-
try {
|
|
149
|
-
const text = await opts.recognizeAudio(src);
|
|
150
|
-
parts.push(text ? `[语音: ${text}]` : '[语音]');
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
parts.push('[语音]');
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
parts.push('[语音]');
|
|
158
|
-
}
|
|
101
|
+
case 'record':
|
|
102
|
+
parts.push(collect('audio', (data.url ?? data.file)));
|
|
159
103
|
break;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
const src = (data.url ?? data.file);
|
|
163
|
-
if (opts.videoRecognitionEnabled !== false && opts.recognizeVideo && src) {
|
|
164
|
-
try {
|
|
165
|
-
const text = await opts.recognizeVideo(src);
|
|
166
|
-
parts.push(text ? `[视频: ${text}]` : '[视频]');
|
|
167
|
-
}
|
|
168
|
-
catch {
|
|
169
|
-
parts.push('[视频]');
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
parts.push('[视频]');
|
|
174
|
-
}
|
|
104
|
+
case 'video':
|
|
105
|
+
parts.push(collect('video', (data.url ?? data.file)));
|
|
175
106
|
break;
|
|
176
|
-
}
|
|
177
107
|
case 'share':
|
|
178
|
-
parts.push(`[分享:${String(data.title ?? '')}]`);
|
|
108
|
+
parts.push(`[分享:${stripNul(String(data.title ?? ''))}]`);
|
|
179
109
|
break;
|
|
180
110
|
case 'json':
|
|
181
111
|
parts.push('[JSON卡片]');
|
|
@@ -185,7 +115,7 @@ async function renderNodeContent(content, opts) {
|
|
|
185
115
|
break;
|
|
186
116
|
default:
|
|
187
117
|
if (s.type)
|
|
188
|
-
parts.push(`[${s.type}]`);
|
|
118
|
+
parts.push(`[${stripNul(s.type)}]`);
|
|
189
119
|
}
|
|
190
120
|
}
|
|
191
121
|
return parts.join('');
|
|
@@ -201,7 +131,7 @@ function extractNodeMeta(item) {
|
|
|
201
131
|
const node = item && typeof item === 'object' ? item : {};
|
|
202
132
|
const data = (node.type === 'node' && node.data && typeof node.data === 'object' ? node.data : node);
|
|
203
133
|
const sender = (node.sender && typeof node.sender === 'object' ? node.sender : undefined);
|
|
204
|
-
const nickname = String(data.nickname ?? sender?.nickname ?? data.name ?? data.user_id ?? sender?.user_id ?? '匿名');
|
|
134
|
+
const nickname = stripNul(String(data.nickname ?? sender?.nickname ?? data.name ?? data.user_id ?? sender?.user_id ?? '匿名'));
|
|
205
135
|
const userIdRaw = data.user_id ?? data.uin ?? sender?.user_id;
|
|
206
136
|
const userId = userIdRaw != null ? String(userIdRaw) : undefined;
|
|
207
137
|
const content = data.content ?? node.content ?? data.message ?? node.message;
|
|
@@ -235,6 +165,20 @@ export async function expandForward(topId, topNodes, opts) {
|
|
|
235
165
|
let truncatedDepth = false;
|
|
236
166
|
let truncatedNodes = false;
|
|
237
167
|
let topCount = 0;
|
|
168
|
+
// 媒体两阶段:walk 只登记任务放 token,遍历完成后统一交 resolveMedia 再回填。
|
|
169
|
+
const tasks = [];
|
|
170
|
+
const kindEnabled = {
|
|
171
|
+
image: opts.imageRecognitionEnabled && !!opts.resolveMedia,
|
|
172
|
+
audio: opts.audioRecognitionEnabled !== false && !!opts.resolveMedia,
|
|
173
|
+
video: opts.videoRecognitionEnabled !== false && !!opts.resolveMedia,
|
|
174
|
+
};
|
|
175
|
+
const collect = (kind, src) => {
|
|
176
|
+
if (!src || !kindEnabled[kind])
|
|
177
|
+
return MEDIA_LABEL[kind].placeholder;
|
|
178
|
+
const token = `\u0000M${tasks.length}\u0000`;
|
|
179
|
+
tasks.push({ token, kind, src });
|
|
180
|
+
return token;
|
|
181
|
+
};
|
|
238
182
|
async function walk(id, nodesInput, depth) {
|
|
239
183
|
if (depth > opts.maxDepth) {
|
|
240
184
|
truncatedDepth = true;
|
|
@@ -267,7 +211,7 @@ export async function expandForward(topId, topNodes, opts) {
|
|
|
267
211
|
else {
|
|
268
212
|
participants.set(meta.nickname, meta.nickname);
|
|
269
213
|
}
|
|
270
|
-
const rendered =
|
|
214
|
+
const rendered = renderNodeContent(meta.content, collect);
|
|
271
215
|
lines.push({
|
|
272
216
|
depth,
|
|
273
217
|
index: i + 1,
|
|
@@ -291,6 +235,37 @@ export async function expandForward(topId, topNodes, opts) {
|
|
|
291
235
|
}
|
|
292
236
|
}
|
|
293
237
|
await walk(topId, topNodes, 1);
|
|
238
|
+
// 媒体解析回填:遍历已完成、全部任务在手,一次性交给注入方(下载先行、识别受限并发)。
|
|
239
|
+
// resolveMedia 整体失败按「全部未识别」处理,占位符兜底,不让展开本身失败。
|
|
240
|
+
if (tasks.length > 0) {
|
|
241
|
+
let resolved = new Map();
|
|
242
|
+
if (opts.resolveMedia) {
|
|
243
|
+
try {
|
|
244
|
+
// 返回值形态失约(非 Map)与抛错同罪同罚:占位符兜底,不让展开失败
|
|
245
|
+
const r = await opts.resolveMedia(tasks);
|
|
246
|
+
if (r instanceof Map)
|
|
247
|
+
resolved = r;
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
resolved = new Map();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const byToken = new Map(tasks.map(t => [t.token, t]));
|
|
254
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: NUL 是刻意选的 token 哨兵;输入文本已在渲染时剥 NUL,仅我方 token 含之
|
|
255
|
+
const tokenRe = /\u0000M\d+\u0000/g;
|
|
256
|
+
for (const ln of lines) {
|
|
257
|
+
if (!ln.text.includes('\u0000'))
|
|
258
|
+
continue;
|
|
259
|
+
ln.text = ln.text.replace(tokenRe, tok => {
|
|
260
|
+
const task = byToken.get(tok);
|
|
261
|
+
if (!task)
|
|
262
|
+
return '';
|
|
263
|
+
const desc = resolved.get(tok)?.trim();
|
|
264
|
+
const label = MEDIA_LABEL[task.kind];
|
|
265
|
+
return desc ? `${label.prefix}${desc}${label.suffix}` : label.placeholder;
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
294
269
|
// 拼接 fullText
|
|
295
270
|
const indent = (d) => ' '.repeat(Math.max(0, d - 1));
|
|
296
271
|
const fullLines = lines.map(ln => {
|
package/dist/forward.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forward.js","sourceRoot":"","sources":["../src/forward.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"forward.js","sourceRoot":"","sources":["../src/forward.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,6 +10,16 @@ export declare const inject: {
|
|
|
10
10
|
export declare const provides: string[];
|
|
11
11
|
export declare const reusable = true;
|
|
12
12
|
export declare const configSchema: ConfigSchema;
|
|
13
|
+
/**
|
|
14
|
+
* 结清全部在飞 action:清定时器、reject 唤醒等待方、清账。返回结清条数。
|
|
15
|
+
* ws 断开与插件拆卸两条清理路共用——只清定时器不 reject 会让等待方的 promise
|
|
16
|
+
* 永久悬空(bounce 瞬间在飞的 get_forward_msg/get_msg 静默丢失、闭包泄漏)。
|
|
17
|
+
* @internal 导出仅为让对称性可被直接断言。
|
|
18
|
+
*/
|
|
19
|
+
export declare function settlePendingActions(pendingActions: Map<string, {
|
|
20
|
+
reject: (err: Error) => void;
|
|
21
|
+
timer: ReturnType<typeof setTimeout>;
|
|
22
|
+
}>, reason: string): number;
|
|
13
23
|
/**
|
|
14
24
|
* 撤回通知文案(纯函数,供单测)。
|
|
15
25
|
*
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AA6DzD,eAAO,MAAM,IAAI,iCAAiC,CAAC;AACnD,eAAO,MAAM,WAAW,8BAAe,CAAC;AACxC,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,MAAM;;;CAGlB,CAAC;AACF,eAAO,MAAM,QAAQ,UAAe,CAAC;AACrC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAE7B,eAAO,MAAM,YAAY,EAAE,YAoK1B,CAAC;AAyBF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;CAAE,CAAC,EACnG,MAAM,EAAE,MAAM,GACb,MAAM,CAQR;AAuBD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CAoBT;AAqID;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAyEvF;AA8BD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAquDzE"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { createStorageGateway } from '@aalis/api-storage';
|
|
|
3
3
|
import { AttachmentRefKind, formatAttachmentRef, getSenderLabel, WellKnownNoticeTypes, } from '@aalis/schema-message';
|
|
4
4
|
import { truncateChars } from '@aalis/util-text-normalize';
|
|
5
5
|
import WebSocket from 'ws';
|
|
6
|
-
import {
|
|
6
|
+
import { cacheOneAttachment } from './attachment-cache.js';
|
|
7
7
|
import { renderAttachmentsAsContentMarkers } from './attachments.js';
|
|
8
8
|
import { createForwardExpander, DEFAULT_FORWARD_SUMMARY_PROMPT } from './forward-expand.js';
|
|
9
9
|
import { extractSentMessageId, SentMessageTracker } from './sent-messages.js';
|
|
@@ -22,6 +22,7 @@ function parseForwardConfig(config) {
|
|
|
22
22
|
imageRecognitionConcurrency: typeof fwdRaw.imageRecognitionConcurrency === 'number'
|
|
23
23
|
? Math.max(1, Math.floor(fwdRaw.imageRecognitionConcurrency))
|
|
24
24
|
: 8,
|
|
25
|
+
recognitionMaxItems: typeof fwdRaw.recognitionMaxItems === 'number' ? Math.max(0, Math.floor(fwdRaw.recognitionMaxItems)) : 32,
|
|
25
26
|
summarize: fwdRaw.summarize !== false,
|
|
26
27
|
summaryLLM: fwdRaw.summaryLLM &&
|
|
27
28
|
typeof fwdRaw.summaryLLM === 'object' &&
|
|
@@ -137,9 +138,17 @@ export const configSchema = {
|
|
|
137
138
|
},
|
|
138
139
|
imageRecognitionConcurrency: {
|
|
139
140
|
type: 'number',
|
|
140
|
-
label: '
|
|
141
|
+
label: '媒体识别并发上限',
|
|
141
142
|
default: 8,
|
|
142
|
-
description: '
|
|
143
|
+
description: '单条消息的转发展开内允许同时进行的媒体识别(图片/语音/视频)任务数。' +
|
|
144
|
+
'本地模型部署建议设 1-2:转发批量识别是后台工作,低并发能减少对实时入站识别的挤占' +
|
|
145
|
+
'(注意这是统计性缓解,不是优先级调度——多条消息各有各的并发额度,模型侧也无插队机制)。',
|
|
146
|
+
},
|
|
147
|
+
recognitionMaxItems: {
|
|
148
|
+
type: 'number',
|
|
149
|
+
label: '单条转发媒体识别上限',
|
|
150
|
+
default: 32,
|
|
151
|
+
description: '单条合并转发内最多识别多少个媒体(图片/语音/视频合计);超出的以 [图片] 等占位符保留,不再消耗模型算力。设为 0 表示不限。',
|
|
143
152
|
},
|
|
144
153
|
summarize: {
|
|
145
154
|
type: 'boolean',
|
|
@@ -197,6 +206,21 @@ export const configSchema = {
|
|
|
197
206
|
},
|
|
198
207
|
},
|
|
199
208
|
};
|
|
209
|
+
/**
|
|
210
|
+
* 结清全部在飞 action:清定时器、reject 唤醒等待方、清账。返回结清条数。
|
|
211
|
+
* ws 断开与插件拆卸两条清理路共用——只清定时器不 reject 会让等待方的 promise
|
|
212
|
+
* 永久悬空(bounce 瞬间在飞的 get_forward_msg/get_msg 静默丢失、闭包泄漏)。
|
|
213
|
+
* @internal 导出仅为让对称性可被直接断言。
|
|
214
|
+
*/
|
|
215
|
+
export function settlePendingActions(pendingActions, reason) {
|
|
216
|
+
const n = pendingActions.size;
|
|
217
|
+
for (const [, pending] of pendingActions) {
|
|
218
|
+
clearTimeout(pending.timer);
|
|
219
|
+
pending.reject(new Error(reason));
|
|
220
|
+
}
|
|
221
|
+
pendingActions.clear();
|
|
222
|
+
return n;
|
|
223
|
+
}
|
|
200
224
|
// ===== 聊天流控类型(已迁移)=====
|
|
201
225
|
//
|
|
202
226
|
// 旧的 ChatFlowConfig / FlowSessionState / 流控函数已抽出到独立插件:
|
|
@@ -290,28 +314,6 @@ const KIND_PLACEHOLDER = {
|
|
|
290
314
|
video: { placeholder: '[视频]', ref: AttachmentRefKind.Video },
|
|
291
315
|
file: { placeholder: '[文件]', ref: AttachmentRefKind.File },
|
|
292
316
|
};
|
|
293
|
-
/**
|
|
294
|
-
* 把单个附件下载(必要时转码)后落盘,返回相对路径。失败返回 null。
|
|
295
|
-
* - audio:先 ffmpeg → 16kHz mono WAV,再以 .wav 入库(用户期望转码后存储,
|
|
296
|
-
* 方便后续 LLM 反复分析;同时避免下游每次重转码)。
|
|
297
|
-
* - 其他 kind:原样落盘,扩展名按 magic header 推断。
|
|
298
|
-
*/
|
|
299
|
-
async function cacheOneAttachment(storage, proc, kind, source, sessionId, maxBytes, logger) {
|
|
300
|
-
const buf = await loadAttachmentBuffer(storage, proc, source, maxBytes);
|
|
301
|
-
if (!buf)
|
|
302
|
-
return null;
|
|
303
|
-
if (kind === 'audio') {
|
|
304
|
-
const inExt = detectExtensionFromBuffer(buf, 'bin');
|
|
305
|
-
const wav = await transcodeAudioBufferToWav(proc, storage, buf, inExt);
|
|
306
|
-
if (!wav) {
|
|
307
|
-
logger.warn(`OneBot 音频转 WAV 失败 (in=${inExt}, size=${buf.byteLength}B),保留原 URL`);
|
|
308
|
-
return null;
|
|
309
|
-
}
|
|
310
|
-
return await cacheAttachmentBuffer(storage, wav, 'audio', sessionId, 'wav', maxBytes);
|
|
311
|
-
}
|
|
312
|
-
const ext = detectExtensionFromBuffer(buf, kind === 'image' ? 'jpg' : kind === 'video' ? 'mp4' : 'bin');
|
|
313
|
-
return await cacheAttachmentBuffer(storage, buf, kind, sessionId, ext, maxBytes);
|
|
314
|
-
}
|
|
315
317
|
/**
|
|
316
318
|
* 把 text 中所有 [图片]/[语音]/[视频]/[文件] 占位按 attachments 顺序替换为
|
|
317
319
|
* `[xxx | ref:data/...]`。落盘失败的占位保持原样。
|
|
@@ -795,7 +797,7 @@ export function apply(ctx, config) {
|
|
|
795
797
|
// 2. 嵌套合并转发:展开为信封 + 摘要(命中现有 forward 缓存即零开销)
|
|
796
798
|
if (content.includes('<forward id=')) {
|
|
797
799
|
try {
|
|
798
|
-
content = await expandForwardsInText(state, content, segments);
|
|
800
|
+
content = await expandForwardsInText(state, content, segments, sessionId ?? 'onebot:unknown');
|
|
799
801
|
}
|
|
800
802
|
catch (err) {
|
|
801
803
|
ctx.logger.debug(`引用消息中的合并转发展开失败: ${err}`);
|
|
@@ -840,6 +842,7 @@ export function apply(ctx, config) {
|
|
|
840
842
|
const forwardExpander = createForwardExpander({
|
|
841
843
|
ctx,
|
|
842
844
|
forwardCfg,
|
|
845
|
+
attachmentMaxBytes,
|
|
843
846
|
sendAction,
|
|
844
847
|
});
|
|
845
848
|
const { getCachedForward, setCachedForward, loadPersistedForward, fetchForwardOnce, expandForwardsInText } = forwardExpander;
|
|
@@ -1259,11 +1262,7 @@ export function apply(ctx, config) {
|
|
|
1259
1262
|
state.status = 'offline';
|
|
1260
1263
|
state.ws = undefined;
|
|
1261
1264
|
stopHeartbeat(state);
|
|
1262
|
-
|
|
1263
|
-
clearTimeout(pending.timer);
|
|
1264
|
-
pending.reject(new Error('连接已关闭'));
|
|
1265
|
-
}
|
|
1266
|
-
state.pendingActions.clear();
|
|
1265
|
+
settlePendingActions(state.pendingActions, '连接已关闭');
|
|
1267
1266
|
ctx.logger.warn(`OneBot 连接断开: ${state.config.url},${RECONNECT_INTERVAL / 1000}s 后重连`);
|
|
1268
1267
|
scheduleReconnect(state);
|
|
1269
1268
|
});
|
|
@@ -1429,7 +1428,7 @@ export function apply(ctx, config) {
|
|
|
1429
1428
|
// 这样 LLM 不必再调用工具,且展开后的内容会随 inbound:message 进入历史归档。
|
|
1430
1429
|
if (event.text.includes('<forward id=')) {
|
|
1431
1430
|
try {
|
|
1432
|
-
event.text = await expandForwardsInText(state, event.text, event.message);
|
|
1431
|
+
event.text = await expandForwardsInText(state, event.text, event.message, sessionId);
|
|
1433
1432
|
}
|
|
1434
1433
|
catch (err) {
|
|
1435
1434
|
ctx.logger.debug(`合并转发自动展开失败: ${err}`);
|
|
@@ -2015,9 +2014,9 @@ export function apply(ctx, config) {
|
|
|
2015
2014
|
state.ws.close();
|
|
2016
2015
|
}
|
|
2017
2016
|
}
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2017
|
+
const settled = settlePendingActions(state.pendingActions, '适配器已停止');
|
|
2018
|
+
if (settled > 0)
|
|
2019
|
+
ctx.logger.debug(`适配器停止:拒绝 ${settled} 个在飞 action`);
|
|
2021
2020
|
}
|
|
2022
2021
|
states.length = 0;
|
|
2023
2022
|
});
|