@aalis/plugin-adapter-onebot 0.10.0 → 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 +40 -42
- package/dist/index.js.map +1 -1
- package/dist/v11.d.ts.map +1 -1
- package/dist/v11.js +2 -1
- package/dist/v11.js.map +1 -1
- package/package.json +7 -7
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
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createProcessGateway } from '@aalis/api-process';
|
|
2
2
|
import { createStorageGateway } from '@aalis/api-storage';
|
|
3
|
-
import { AttachmentRefKind, formatAttachmentRef, getSenderLabel } from '@aalis/schema-message';
|
|
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 / 流控函数已抽出到独立插件:
|
|
@@ -281,9 +305,8 @@ function nextEcho() {
|
|
|
281
305
|
}
|
|
282
306
|
// ===== 附件统一缓存 =====
|
|
283
307
|
//
|
|
284
|
-
//
|
|
285
|
-
//
|
|
286
|
-
// 多模态历史回放。详见 ./attachment-cache.ts。
|
|
308
|
+
// image/audio/video/file 一律落盘到 data/{kind}s/{session}/{hash}.{ext},便于人工归档、
|
|
309
|
+
// 跨轮工具复用、多模态历史回放。详见 ./attachment-cache.ts。
|
|
287
310
|
/** 占位符 → AttachmentRefKind 映射(与 v11/v12 segmentsToText 的输出对齐) */
|
|
288
311
|
const KIND_PLACEHOLDER = {
|
|
289
312
|
image: { placeholder: '[图片]', ref: AttachmentRefKind.Image },
|
|
@@ -291,28 +314,6 @@ const KIND_PLACEHOLDER = {
|
|
|
291
314
|
video: { placeholder: '[视频]', ref: AttachmentRefKind.Video },
|
|
292
315
|
file: { placeholder: '[文件]', ref: AttachmentRefKind.File },
|
|
293
316
|
};
|
|
294
|
-
/**
|
|
295
|
-
* 把单个附件下载(必要时转码)后落盘,返回相对路径。失败返回 null。
|
|
296
|
-
* - audio:先 ffmpeg → 16kHz mono WAV,再以 .wav 入库(用户期望转码后存储,
|
|
297
|
-
* 方便后续 LLM 反复分析;同时避免下游每次重转码)。
|
|
298
|
-
* - 其他 kind:原样落盘,扩展名按 magic header 推断。
|
|
299
|
-
*/
|
|
300
|
-
async function cacheOneAttachment(storage, proc, kind, source, sessionId, maxBytes, logger) {
|
|
301
|
-
const buf = await loadAttachmentBuffer(storage, proc, source, maxBytes);
|
|
302
|
-
if (!buf)
|
|
303
|
-
return null;
|
|
304
|
-
if (kind === 'audio') {
|
|
305
|
-
const inExt = detectExtensionFromBuffer(buf, 'bin');
|
|
306
|
-
const wav = await transcodeAudioBufferToWav(proc, storage, buf, inExt);
|
|
307
|
-
if (!wav) {
|
|
308
|
-
logger.warn(`OneBot 音频转 WAV 失败 (in=${inExt}, size=${buf.byteLength}B),保留原 URL`);
|
|
309
|
-
return null;
|
|
310
|
-
}
|
|
311
|
-
return await cacheAttachmentBuffer(storage, wav, 'audio', sessionId, 'wav', maxBytes);
|
|
312
|
-
}
|
|
313
|
-
const ext = detectExtensionFromBuffer(buf, kind === 'image' ? 'jpg' : kind === 'video' ? 'mp4' : 'bin');
|
|
314
|
-
return await cacheAttachmentBuffer(storage, buf, kind, sessionId, ext, maxBytes);
|
|
315
|
-
}
|
|
316
317
|
/**
|
|
317
318
|
* 把 text 中所有 [图片]/[语音]/[视频]/[文件] 占位按 attachments 顺序替换为
|
|
318
319
|
* `[xxx | ref:data/...]`。落盘失败的占位保持原样。
|
|
@@ -796,7 +797,7 @@ export function apply(ctx, config) {
|
|
|
796
797
|
// 2. 嵌套合并转发:展开为信封 + 摘要(命中现有 forward 缓存即零开销)
|
|
797
798
|
if (content.includes('<forward id=')) {
|
|
798
799
|
try {
|
|
799
|
-
content = await expandForwardsInText(state, content, segments);
|
|
800
|
+
content = await expandForwardsInText(state, content, segments, sessionId ?? 'onebot:unknown');
|
|
800
801
|
}
|
|
801
802
|
catch (err) {
|
|
802
803
|
ctx.logger.debug(`引用消息中的合并转发展开失败: ${err}`);
|
|
@@ -841,6 +842,7 @@ export function apply(ctx, config) {
|
|
|
841
842
|
const forwardExpander = createForwardExpander({
|
|
842
843
|
ctx,
|
|
843
844
|
forwardCfg,
|
|
845
|
+
attachmentMaxBytes,
|
|
844
846
|
sendAction,
|
|
845
847
|
});
|
|
846
848
|
const { getCachedForward, setCachedForward, loadPersistedForward, fetchForwardOnce, expandForwardsInText } = forwardExpander;
|
|
@@ -1260,11 +1262,7 @@ export function apply(ctx, config) {
|
|
|
1260
1262
|
state.status = 'offline';
|
|
1261
1263
|
state.ws = undefined;
|
|
1262
1264
|
stopHeartbeat(state);
|
|
1263
|
-
|
|
1264
|
-
clearTimeout(pending.timer);
|
|
1265
|
-
pending.reject(new Error('连接已关闭'));
|
|
1266
|
-
}
|
|
1267
|
-
state.pendingActions.clear();
|
|
1265
|
+
settlePendingActions(state.pendingActions, '连接已关闭');
|
|
1268
1266
|
ctx.logger.warn(`OneBot 连接断开: ${state.config.url},${RECONNECT_INTERVAL / 1000}s 后重连`);
|
|
1269
1267
|
scheduleReconnect(state);
|
|
1270
1268
|
});
|
|
@@ -1430,7 +1428,7 @@ export function apply(ctx, config) {
|
|
|
1430
1428
|
// 这样 LLM 不必再调用工具,且展开后的内容会随 inbound:message 进入历史归档。
|
|
1431
1429
|
if (event.text.includes('<forward id=')) {
|
|
1432
1430
|
try {
|
|
1433
|
-
event.text = await expandForwardsInText(state, event.text, event.message);
|
|
1431
|
+
event.text = await expandForwardsInText(state, event.text, event.message, sessionId);
|
|
1434
1432
|
}
|
|
1435
1433
|
catch (err) {
|
|
1436
1434
|
ctx.logger.debug(`合并转发自动展开失败: ${err}`);
|
|
@@ -1593,7 +1591,7 @@ export function apply(ctx, config) {
|
|
|
1593
1591
|
return;
|
|
1594
1592
|
ctx.logger.debug(`OneBot[${state.protocol.version}] 通知事件: ${notice.noticeType}${notice.subType ? `/${notice.subType}` : ''}`);
|
|
1595
1593
|
// 戳一戳 → 仅在目标是 bot 时触发 agent 回复
|
|
1596
|
-
if (notice.noticeType ===
|
|
1594
|
+
if (notice.noticeType === WellKnownNoticeTypes.Poke) {
|
|
1597
1595
|
const selfId = notice.selfId;
|
|
1598
1596
|
const targetIsBot = notice.targetId === selfId;
|
|
1599
1597
|
if (notice.groupId) {
|
|
@@ -1615,7 +1613,7 @@ export function apply(ctx, config) {
|
|
|
1615
1613
|
nickname: nick,
|
|
1616
1614
|
sessionType: 'group',
|
|
1617
1615
|
groupId: notice.groupId,
|
|
1618
|
-
noticeType:
|
|
1616
|
+
noticeType: WellKnownNoticeTypes.Poke,
|
|
1619
1617
|
});
|
|
1620
1618
|
})().catch(err => ctx.logger.warn(`poke 处理异常: ${err}`));
|
|
1621
1619
|
}
|
|
@@ -1633,7 +1631,7 @@ export function apply(ctx, config) {
|
|
|
1633
1631
|
userId: notice.userId,
|
|
1634
1632
|
nickname: nick,
|
|
1635
1633
|
sessionType: 'private',
|
|
1636
|
-
noticeType:
|
|
1634
|
+
noticeType: WellKnownNoticeTypes.Poke,
|
|
1637
1635
|
});
|
|
1638
1636
|
})().catch(err => ctx.logger.warn(`poke 处理异常: ${err}`));
|
|
1639
1637
|
}
|
|
@@ -2016,9 +2014,9 @@ export function apply(ctx, config) {
|
|
|
2016
2014
|
state.ws.close();
|
|
2017
2015
|
}
|
|
2018
2016
|
}
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2017
|
+
const settled = settlePendingActions(state.pendingActions, '适配器已停止');
|
|
2018
|
+
if (settled > 0)
|
|
2019
|
+
ctx.logger.debug(`适配器停止:拒绝 ${settled} 个在飞 action`);
|
|
2022
2020
|
}
|
|
2023
2021
|
states.length = 0;
|
|
2024
2022
|
});
|