@aalis/plugin-image-sender 0.1.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/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +375 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Context } from '@aalis/core';
|
|
2
|
+
export declare const name = "@aalis/plugin-image-sender";
|
|
3
|
+
export declare const displayName = "\u56FE\u7247\u53D1\u9001";
|
|
4
|
+
export declare const subsystem = "tools";
|
|
5
|
+
export declare const inject: {
|
|
6
|
+
optional: string[];
|
|
7
|
+
};
|
|
8
|
+
export declare function apply(ctx: Context): void;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAe3C,eAAO,MAAM,IAAI,+BAA+B,CAAC;AACjD,eAAO,MAAM,WAAW,6BAAS,CAAC;AAClC,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,MAAM;;CAAuD,CAAC;AAe3E,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA6NxC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// @aalis/plugin-image-sender — 让 agent 主动发送图片/语音/视频
|
|
3
|
+
//
|
|
4
|
+
// 工具:
|
|
5
|
+
// 1. preview_image —— 在选图前用 vision 看清候选图(搜索结果标题常误导)
|
|
6
|
+
// 2. send_attachment —— 统一的出站附件接口:把 image/audio/video 发出去;
|
|
7
|
+
// 同步描述并入档,让"AI 之前发过的图/视频"能被
|
|
8
|
+
// memory_recall 召回
|
|
9
|
+
//
|
|
10
|
+
// send_attachment 来源:url / storage_uri / history_ref(不接受裸本地路径)
|
|
11
|
+
// 此插件不直接调用平台 API,而是 emit `outbound:message`(含 attachments[]);
|
|
12
|
+
// 由各 platform adapter(OneBot / WebUI)按自身能力处理结构化附件。
|
|
13
|
+
// ============================================================
|
|
14
|
+
import { AttachmentRefKind, formatAttachmentRef, WellKnownKinds, } from '@aalis/plugin-message-api';
|
|
15
|
+
import { createStorageGateway } from '@aalis/plugin-storage-api';
|
|
16
|
+
import { useToolService } from '@aalis/plugin-tools-api';
|
|
17
|
+
export const name = '@aalis/plugin-image-sender';
|
|
18
|
+
export const displayName = '图片发送';
|
|
19
|
+
export const subsystem = 'tools';
|
|
20
|
+
export const inject = { optional: ['memory', 'media', 'message-archive'] };
|
|
21
|
+
/** preview_image 单张候选识别等待上限。preview 的目的就是"看清"图,
|
|
22
|
+
* 本地视觉模型(如 33B)单图常需 15-25s,必须给足预算,否则必然超时使 preview 形同虚设。 */
|
|
23
|
+
const PREVIEW_TIMEOUT_MS = 25_000;
|
|
24
|
+
/** 出站归档描述等待上限。该描述在后台计算、不阻塞发送,可放宽。 */
|
|
25
|
+
const ARCHIVE_DESCRIBE_TIMEOUT_MS = 25_000;
|
|
26
|
+
/** 视频描述等待上限(视频需抽帧+ASR,耗时远高于图片)。 */
|
|
27
|
+
const VIDEO_DESCRIBE_TIMEOUT_MS = 30_000;
|
|
28
|
+
/** preview_image 单次允许的候选数量上限。 */
|
|
29
|
+
const PREVIEW_MAX_CANDIDATES = 8;
|
|
30
|
+
export function apply(ctx) {
|
|
31
|
+
const tools = useToolService(ctx);
|
|
32
|
+
const storage = createStorageGateway(ctx);
|
|
33
|
+
// 把 storage URI(含 ':/')解析为发送可用的数据串:
|
|
34
|
+
// - stat 验证存在性
|
|
35
|
+
// - 可解析本地路径时转 file://(供 daemon 直链),否则保留原 URI
|
|
36
|
+
async function resolveStorageUri(input) {
|
|
37
|
+
try {
|
|
38
|
+
await storage.stat(input);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return { ok: false, error: `存储资源不存在: ${input}` };
|
|
42
|
+
}
|
|
43
|
+
const local = await tryResolveLocal(storage, input);
|
|
44
|
+
return { ok: true, data: local ? `file://${local}` : input, ref: input };
|
|
45
|
+
}
|
|
46
|
+
// ── preview_image ─────────────────────────────────────────────────────────
|
|
47
|
+
tools.register({
|
|
48
|
+
definition: {
|
|
49
|
+
type: 'function',
|
|
50
|
+
function: {
|
|
51
|
+
name: 'preview_image',
|
|
52
|
+
description: '在真正发送前,先让自己"看见"候选图片的实际内容(vision 模型识别)。' +
|
|
53
|
+
'适用场景:search_images 返回了若干 URL,但标题常常误导/含糊,' +
|
|
54
|
+
'你想从中挑出最符合语境的一张再 send_attachment 发出。' +
|
|
55
|
+
'本工具不发送任何消息,只返回每张图的描述。',
|
|
56
|
+
parameters: {
|
|
57
|
+
type: 'object',
|
|
58
|
+
properties: {
|
|
59
|
+
urls: {
|
|
60
|
+
type: 'array',
|
|
61
|
+
items: { type: 'string' },
|
|
62
|
+
description: `要识别的图片 URL 列表(http/https),最多 ${PREVIEW_MAX_CANDIDATES} 张。`,
|
|
63
|
+
},
|
|
64
|
+
hint: {
|
|
65
|
+
type: 'string',
|
|
66
|
+
description: '可选:给 vision 模型的关注点提示(例如"这张图里有猫吗")。',
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
required: ['urls'],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
handler: async (args) => {
|
|
74
|
+
const urls = Array.isArray(args.urls) ? args.urls.map(String) : [];
|
|
75
|
+
const hint = args.hint || undefined;
|
|
76
|
+
if (urls.length === 0)
|
|
77
|
+
return JSON.stringify({ error: 'urls 不能为空' });
|
|
78
|
+
if (urls.length > PREVIEW_MAX_CANDIDATES) {
|
|
79
|
+
return JSON.stringify({ error: `最多 ${PREVIEW_MAX_CANDIDATES} 张` });
|
|
80
|
+
}
|
|
81
|
+
const media = ctx.getService('media');
|
|
82
|
+
if (!media?.describeImage) {
|
|
83
|
+
return JSON.stringify({ error: '未启用 media 服务,无法识别图片' });
|
|
84
|
+
}
|
|
85
|
+
// 顺序识别(非并发):本地视觉模型通常单实例串行处理,并发只会让多个请求
|
|
86
|
+
// 互相排队、共同超时;逐张识别配合宽松超时,命中率远高于并发。
|
|
87
|
+
// detailLevel='casual':preview 只为"挑图",跳过 auto 的分类阶段、用短 prompt,更快。
|
|
88
|
+
const results = [];
|
|
89
|
+
for (let index = 0; index < urls.length; index++) {
|
|
90
|
+
const trimmed = urls[index].trim();
|
|
91
|
+
if (!trimmed.startsWith('http://') && !trimmed.startsWith('https://')) {
|
|
92
|
+
results.push({ index, url: trimmed, ok: false, error: 'url 必须是 http/https' });
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
const desc = await Promise.race([
|
|
97
|
+
media.describeImage(trimmed, { hint, detailLevel: 'casual' }),
|
|
98
|
+
new Promise((_resolve, reject) => setTimeout(() => reject(new Error('vision 超时')), PREVIEW_TIMEOUT_MS)),
|
|
99
|
+
]);
|
|
100
|
+
const description = (desc ?? '').trim();
|
|
101
|
+
results.push(description
|
|
102
|
+
? { index, url: trimmed, ok: true, description }
|
|
103
|
+
: { index, url: trimmed, ok: false, error: 'vision 返回空' });
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
results.push({ index, url: trimmed, ok: false, error: err instanceof Error ? err.message : String(err) });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return JSON.stringify({ ok: true, count: results.length, results });
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
// ── send_attachment ───────────────────────────────────────────────────────
|
|
113
|
+
tools.register({
|
|
114
|
+
definition: {
|
|
115
|
+
type: 'function',
|
|
116
|
+
function: {
|
|
117
|
+
name: 'send_attachment',
|
|
118
|
+
description: '主动向当前会话发送一个附件(图片 / 语音 / 视频,仅附件本身,不带文字)。\n' +
|
|
119
|
+
'使用场景:用户请求"发个表情包"、"发刚才那张图/那段语音给我"、"在网上找张猫的图"等。\n' +
|
|
120
|
+
'kind 必填,指定附件类型;来源三选一:\n' +
|
|
121
|
+
' - url:网络资源 URL(http/https)。\n' +
|
|
122
|
+
' - storage_uri:存储库内的资源 URI(如 data:/images/xxx)。\n' +
|
|
123
|
+
' - history_ref:历史消息中已识别的引用([图片/语音/视频: ... | ref:xxx] 中 xxx 部分),\n' +
|
|
124
|
+
' 用于"把之前那条媒体重发/转发回去"。\n' +
|
|
125
|
+
'建议流程(图片):search_images 拿候选 URL → preview_image 看清内容 → send_attachment 选其一发出。\n' +
|
|
126
|
+
'若想重发自己之前发过的媒体,先用 memory_recall 按描述检索历史,从命中消息里找到 ref 再传 history_ref。\n' +
|
|
127
|
+
'注意:本工具不发送任何文字。如需配文,请把文字写在你本轮最终输出的 message 字段里——' +
|
|
128
|
+
'不要在 message 中重复媒体描述。',
|
|
129
|
+
parameters: {
|
|
130
|
+
type: 'object',
|
|
131
|
+
properties: {
|
|
132
|
+
kind: {
|
|
133
|
+
type: 'string',
|
|
134
|
+
enum: ['image', 'audio', 'video'],
|
|
135
|
+
description: '附件类型:image=图片,audio=语音,video=视频。',
|
|
136
|
+
},
|
|
137
|
+
url: { type: 'string', description: '网络资源 URL(http/https)。' },
|
|
138
|
+
storage_uri: { type: 'string', description: '存储库内资源 URI(如 data:/images/xxx)。' },
|
|
139
|
+
history_ref: {
|
|
140
|
+
type: 'string',
|
|
141
|
+
description: '历史消息中的引用路径([... | ref:xxx] 中 xxx 部分)。',
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
required: ['kind'],
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
handler: async (args, callCtx) => {
|
|
149
|
+
const kind = args.kind?.trim();
|
|
150
|
+
if (kind !== 'image' && kind !== 'audio' && kind !== 'video') {
|
|
151
|
+
return JSON.stringify({ error: 'kind 必须是 image / audio / video 之一' });
|
|
152
|
+
}
|
|
153
|
+
const url = args.url?.trim();
|
|
154
|
+
const storageUri = args.storage_uri?.trim();
|
|
155
|
+
const historyRef = args.history_ref?.trim();
|
|
156
|
+
let data = null;
|
|
157
|
+
let refTag = null;
|
|
158
|
+
let via = 'url';
|
|
159
|
+
try {
|
|
160
|
+
if (url) {
|
|
161
|
+
if (!url.startsWith('http://') && !url.startsWith('https://')) {
|
|
162
|
+
return JSON.stringify({ error: 'url 必须是 http/https 开头' });
|
|
163
|
+
}
|
|
164
|
+
data = url;
|
|
165
|
+
refTag = url;
|
|
166
|
+
via = 'url';
|
|
167
|
+
}
|
|
168
|
+
else if (storageUri) {
|
|
169
|
+
const resolved = await resolveStorageUri(storageUri);
|
|
170
|
+
if (!resolved.ok)
|
|
171
|
+
return JSON.stringify({ error: resolved.error });
|
|
172
|
+
data = resolved.data;
|
|
173
|
+
refTag = resolved.ref;
|
|
174
|
+
via = 'storage_uri';
|
|
175
|
+
}
|
|
176
|
+
else if (historyRef) {
|
|
177
|
+
const found = await resolveHistoryRef(ctx, storage, callCtx.sessionId, historyRef);
|
|
178
|
+
if (!found)
|
|
179
|
+
return JSON.stringify({ error: `未在历史中找到引用: ${historyRef}` });
|
|
180
|
+
data = found;
|
|
181
|
+
refTag = historyRef.replace(/^ref:/, '').trim();
|
|
182
|
+
via = 'history_ref';
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
return JSON.stringify({ error: '必须提供 url / storage_uri / history_ref 之一' });
|
|
186
|
+
}
|
|
187
|
+
// 不在发送路径上同步做 vision 描述:本地视觉模型单图常需 15-25s,
|
|
188
|
+
// 而 emit 串行 await 各监听器,同步等待会直接拖慢真正的出站(onebot/webui 发送)。
|
|
189
|
+
// 描述改由全局出站归档监听器在后台计算(见 apply 内 outbound:message 监听),
|
|
190
|
+
// 不阻塞发送,且用稳定 ref 规避平台落盘改写 data 的竞态。
|
|
191
|
+
const attachment = {
|
|
192
|
+
kind,
|
|
193
|
+
data,
|
|
194
|
+
// 归档承载:ref 随事件携带,由全局出站归档统一入档(见 apply 内 outbound:message 监听)。
|
|
195
|
+
// history_ref 重发标记 skipArchive,避免重复入档 / 向量库膨胀。
|
|
196
|
+
ref: refTag ?? data,
|
|
197
|
+
skipArchive: via === 'history_ref',
|
|
198
|
+
};
|
|
199
|
+
const outgoing = {
|
|
200
|
+
sessionId: callCtx.sessionId,
|
|
201
|
+
content: '',
|
|
202
|
+
attachments: [attachment],
|
|
203
|
+
source: 'agent',
|
|
204
|
+
};
|
|
205
|
+
ctx.emit('outbound:message', outgoing);
|
|
206
|
+
return JSON.stringify({ ok: true, sent: { kind, via, ref: refTag } });
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
ctx.logger.info('[image-sender] 工具 send_attachment / preview_image 已注册');
|
|
214
|
+
// ── 出站附件归档:统一咽喉 ───────────────────────────────────────────────
|
|
215
|
+
// 监听唯一出站汇聚点 outbound:message,对所有 agent 出站附件统一入档,
|
|
216
|
+
// 与生产者(send_attachment 或将来任何直接 emit 附件的插件)和平台都解耦。
|
|
217
|
+
// 用 att.ref(生产者声明的稳定引用)而非 att.data 入档,避免 onebot 等适配器
|
|
218
|
+
// 落盘后改写 data 造成归档到不可访问路径;att.skipArchive 跳过 history_ref 重发。
|
|
219
|
+
ctx.on('outbound:message', msg => {
|
|
220
|
+
if (msg.source !== 'agent' || !msg.attachments?.length)
|
|
221
|
+
return;
|
|
222
|
+
const archive = ctx.getService('message-archive');
|
|
223
|
+
if (!archive?.saveMessage)
|
|
224
|
+
return;
|
|
225
|
+
for (const att of msg.attachments) {
|
|
226
|
+
if (att.skipArchive)
|
|
227
|
+
continue;
|
|
228
|
+
if (att.kind !== 'image' && att.kind !== 'audio' && att.kind !== 'video')
|
|
229
|
+
continue;
|
|
230
|
+
// 用稳定 ref(生产者声明)而非 att.data:避免 onebot 等适配器落盘后改写 data。
|
|
231
|
+
const ref = att.ref ?? att.data;
|
|
232
|
+
const kind = att.kind;
|
|
233
|
+
const carried = att.description ?? '';
|
|
234
|
+
// 后台异步:监听器同步返回,避免阻塞出站事件链(emit 串行 await,阻塞会拖慢 onebot/webui 发送)。
|
|
235
|
+
// 描述用宽松超时在背景补齐,让档案 [图片: desc | ref] 能被 memory_recall 命中。
|
|
236
|
+
void (async () => {
|
|
237
|
+
let desc = carried;
|
|
238
|
+
if (!desc && (kind === 'image' || kind === 'video') && /^https?:\/\//i.test(ref)) {
|
|
239
|
+
desc = await safeDescribeMedia(ctx, kind, ref, ARCHIVE_DESCRIBE_TIMEOUT_MS);
|
|
240
|
+
}
|
|
241
|
+
await archiveOutboundAttachment(ctx, msg.sessionId, ref, desc, kind);
|
|
242
|
+
})();
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
/** 按 kind 调用对应的 media 描述能力,超时或失败返回空串(不阻塞发送)。 */
|
|
247
|
+
async function safeDescribeMedia(ctx, kind, data, timeoutMs = ARCHIVE_DESCRIBE_TIMEOUT_MS) {
|
|
248
|
+
if (kind === 'image')
|
|
249
|
+
return safeDescribe(ctx, data, timeoutMs);
|
|
250
|
+
if (kind === 'video')
|
|
251
|
+
return safeDescribeVideo(ctx, data);
|
|
252
|
+
// audio 暂无描述能力
|
|
253
|
+
return '';
|
|
254
|
+
}
|
|
255
|
+
/** 调 media.describeImage,超时或失败返回空串(不阻塞发送)。 */
|
|
256
|
+
async function safeDescribe(ctx, imageData, timeoutMs = ARCHIVE_DESCRIBE_TIMEOUT_MS) {
|
|
257
|
+
const media = ctx.getService('media');
|
|
258
|
+
if (!media?.describeImage)
|
|
259
|
+
return '';
|
|
260
|
+
try {
|
|
261
|
+
const desc = await Promise.race([
|
|
262
|
+
media.describeImage(imageData),
|
|
263
|
+
new Promise((_resolve, reject) => setTimeout(() => reject(new Error('vision 超时')), timeoutMs)),
|
|
264
|
+
]);
|
|
265
|
+
return (desc ?? '').trim();
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
ctx.logger.debug(`[image-sender] vision 失败,跳过描述: ${err instanceof Error ? err.message : err}`);
|
|
269
|
+
return '';
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/** 调 media.describeVideo,超时或失败返回空串(视频抽帧耗时长,用更宽松的超时)。 */
|
|
273
|
+
async function safeDescribeVideo(ctx, videoUrl) {
|
|
274
|
+
const media = ctx.getService('media');
|
|
275
|
+
if (!media?.describeVideo)
|
|
276
|
+
return '';
|
|
277
|
+
try {
|
|
278
|
+
const desc = await Promise.race([
|
|
279
|
+
media.describeVideo(videoUrl),
|
|
280
|
+
new Promise((_resolve, reject) => setTimeout(() => reject(new Error('video 描述超时')), VIDEO_DESCRIBE_TIMEOUT_MS)),
|
|
281
|
+
]);
|
|
282
|
+
return (desc ?? '').trim();
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
ctx.logger.debug(`[image-sender] video 描述失败,跳过: ${err instanceof Error ? err.message : err}`);
|
|
286
|
+
return '';
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/** 把 AI 自己发出的图/语音/视频入档为一条 assistant 消息,让 memory_recall 能找到。 */
|
|
290
|
+
async function archiveOutboundAttachment(ctx, sessionId, ref, description, kind) {
|
|
291
|
+
const archive = ctx.getService('message-archive');
|
|
292
|
+
if (!archive?.saveMessage)
|
|
293
|
+
return;
|
|
294
|
+
const attachKind = kind === 'video' ? AttachmentRefKind.Video : kind === 'audio' ? AttachmentRefKind.Audio : AttachmentRefKind.Image;
|
|
295
|
+
const msgKind = kind === 'video'
|
|
296
|
+
? WellKnownKinds.OutboundVideo
|
|
297
|
+
: kind === 'audio'
|
|
298
|
+
? WellKnownKinds.OutboundAudio
|
|
299
|
+
: WellKnownKinds.OutboundImage;
|
|
300
|
+
const label = kind === 'video' ? '视频' : kind === 'audio' ? '语音' : '图片';
|
|
301
|
+
const tag = formatAttachmentRef({ kind: attachKind, desc: description, ref });
|
|
302
|
+
const message = {
|
|
303
|
+
role: 'assistant',
|
|
304
|
+
kind: msgKind,
|
|
305
|
+
content: tag,
|
|
306
|
+
timestamp: Date.now(),
|
|
307
|
+
metadata: { source: 'image-sender', ref },
|
|
308
|
+
};
|
|
309
|
+
try {
|
|
310
|
+
await archive.saveMessage(sessionId, message, {
|
|
311
|
+
debugLabel: `[image-sender] 已入档发送的${label}`,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
ctx.logger.warn(`[image-sender] 入档失败: ${err instanceof Error ? err.message : err}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/** 在最近 200 条消息里寻找匹配 historyRef 的图片来源(取本地路径或 URL)。 */
|
|
319
|
+
async function resolveHistoryRef(ctx, storage, sessionId, ref) {
|
|
320
|
+
const memory = ctx.getService('memory');
|
|
321
|
+
if (!memory)
|
|
322
|
+
return null;
|
|
323
|
+
const history = memory.getFullHistory
|
|
324
|
+
? await memory.getFullHistory(sessionId, 200)
|
|
325
|
+
: await memory.getHistory(sessionId, 200);
|
|
326
|
+
const normalized = ref.replace(/^ref:/, '').trim();
|
|
327
|
+
// http(s) ref:直接当 URL 用
|
|
328
|
+
if (normalized.startsWith('http://') || normalized.startsWith('https://')) {
|
|
329
|
+
return normalized;
|
|
330
|
+
}
|
|
331
|
+
// file:// ref:原样返回
|
|
332
|
+
if (normalized.startsWith('file://'))
|
|
333
|
+
return normalized;
|
|
334
|
+
// storage URI 格式:stat 不在则忽略,在则尝试本地路径
|
|
335
|
+
if (normalized.includes(':/')) {
|
|
336
|
+
try {
|
|
337
|
+
await storage.stat(normalized);
|
|
338
|
+
const local = await tryResolveLocal(storage, normalized);
|
|
339
|
+
return local ? `file://${local}` : normalized;
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
// fallthrough 到历史子串匹配
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// 回退:搜历史里 images / attachments 数组里包含 normalized 子串的项
|
|
346
|
+
for (const msg of history) {
|
|
347
|
+
const m = msg;
|
|
348
|
+
if (m.images?.length) {
|
|
349
|
+
for (const img of m.images) {
|
|
350
|
+
if (img.includes(normalized))
|
|
351
|
+
return img;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
if (m.attachments?.length) {
|
|
355
|
+
for (const att of m.attachments) {
|
|
356
|
+
if (att.data.includes(normalized))
|
|
357
|
+
return att.data;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
/** 如果 storage 支持 resolveLocalPath,则解析为本地绝对路径供下游 file:// 直链使用。 */
|
|
364
|
+
async function tryResolveLocal(storage, uri) {
|
|
365
|
+
if (typeof storage.resolveLocalPath !== 'function')
|
|
366
|
+
return null;
|
|
367
|
+
try {
|
|
368
|
+
const p = await storage.resolveLocalPath(uri, 'read');
|
|
369
|
+
return p ?? null;
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aalis/plugin-image-sender",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"aalis-plugin"
|
|
7
|
+
],
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@aalis/plugin-message-api": "^0.1.0",
|
|
15
|
+
"@aalis/plugin-storage-api": "^0.1.0",
|
|
16
|
+
"@aalis/plugin-tools-api": "^0.1.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/node": "^22.0.0",
|
|
20
|
+
"typescript": "^5.7.0",
|
|
21
|
+
"@aalis/core": "0.1.0",
|
|
22
|
+
"@aalis/plugin-media-api": "0.1.0",
|
|
23
|
+
"@aalis/plugin-message-archive-api": "0.1.0",
|
|
24
|
+
"@aalis/plugin-memory-api": "0.1.0"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"@aalis/core": "^0.1.0"
|
|
28
|
+
},
|
|
29
|
+
"aalis": {
|
|
30
|
+
"service": {
|
|
31
|
+
"optional": [
|
|
32
|
+
"memory",
|
|
33
|
+
"media",
|
|
34
|
+
"message-archive"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc",
|
|
40
|
+
"dev": "tsc --watch"
|
|
41
|
+
}
|
|
42
|
+
}
|