@aalis/plugin-image-sender 0.8.0 → 0.10.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/README.md +7 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +165 -213
- package/dist/index.js.map +1 -1
- package/dist/locales/en.d.ts +5 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/en.js +5 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/texts.d.ts +9 -0
- package/dist/texts.d.ts.map +1 -0
- package/dist/texts.js +8 -0
- package/dist/texts.js.map +1 -0
- package/package.json +18 -10
- package/dist/media-signature.d.ts +0 -13
- package/dist/media-signature.d.ts.map +0 -1
- package/dist/media-signature.js +0 -154
- package/dist/media-signature.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
图片发送:将生成/本地图片经平台发出
|
|
4
4
|
|
|
5
|
+
`send_attachment` 等待目标适配器确认后才返回 `ok: true`;下载、连接或平台发送失败返回 `error`。图源失效时可重新选图,不能把调用工具当成已送达。发出的附件(`history_ref` 重发的、回复里转出的也一样)不由本插件记进会话历史:送达之后由 message-archive 的 `recordOutbound` 记,网址的图片与视频在后台补识图描述(见 [plugin-message-archive](../../docs/plugins/plugin-message-archive.md))。出站消息带这次调用的回合 id 与 `callId`。
|
|
6
|
+
|
|
7
|
+
存储库里的媒体先过媒体判据再发(`@aalis/api-media` 的 `mediaScopeOf`):本会话收到或产生的能发;别的会话的媒体按会话管理的取用规则,带这次调用的授权身份(几个人的一轮逐个参与者判,某人自己私聊里的、别人过不了的由他本人批);不属于任何会话的本机文件只在这一轮的主体是 owner(或 owner 授权的自动运行在没有别人的会话里)时能发,owner 与别人同在的一轮要 owner 批。带 markup 的正文(她的回复)里存储地址的媒体标记由本插件在出站前转成附件,按回复所在那一轮的授权身份过同一份判据(几个人的一轮不带授权身份,不是回合里的回复同样不带),不出审批;不装本插件时发不出,规则见[文档](../../docs/services/media.md#媒体判据)的「出站转换」。
|
|
8
|
+
|
|
9
|
+
OneBot 的成功表示平台接口已确认接受;WebUI 表示已经记进会话历史,不代表用户已阅读或浏览器已加载外部图片。未提供确认的第三方适配器不能返回成功。
|
|
10
|
+
|
|
5
11
|
## 安装
|
|
6
12
|
|
|
7
13
|
```bash
|
|
@@ -13,7 +19,7 @@ pnpm add @aalis/plugin-image-sender
|
|
|
13
19
|
`definePlugin` 默认导出:
|
|
14
20
|
|
|
15
21
|
- provides:无
|
|
16
|
-
- uses:`events`、`logger`;可选 `tools`、`storage`、`media`、`memory`、`
|
|
22
|
+
- uses:`events`、`logger`;可选 `tools`、`hooks`、`storage`、`media`、`memory`、`sessionManager`(`session-manager`)、`authority`
|
|
17
23
|
|
|
18
24
|
## 文档
|
|
19
25
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { type StorageService } from '@aalis/api-storage';
|
|
2
1
|
declare const _default: import("@aalis/core").PluginDefinition<{
|
|
3
2
|
tools: import("@aalis/core").OptionalUse<import("@aalis/api-tools").ToolService, import("@aalis/api-tools").BoundTools>;
|
|
3
|
+
hooks: import("@aalis/core").OptionalUse<import("@aalis/api-hooks").HookRegistry, import("@aalis/api-hooks").Hooks>;
|
|
4
4
|
events: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Events, import("@aalis/core").Events>;
|
|
5
5
|
logger: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Logger, import("@aalis/core").Logger>;
|
|
6
|
-
storage: import("@aalis/core").OptionalUse<StorageService, import("@aalis/
|
|
7
|
-
media: import("@aalis/core").OptionalUse<import("@aalis/api-media").MediaService, import("@aalis/
|
|
8
|
-
memory: import("@aalis/core").OptionalUse<import("@aalis/api-memory").MemoryService, import("@aalis/
|
|
9
|
-
|
|
6
|
+
storage: import("@aalis/core").OptionalUse<import("@aalis/api-storage").StorageService, import("@aalis/api-storage").BoundStorage>;
|
|
7
|
+
media: import("@aalis/core").OptionalUse<import("@aalis/api-media").MediaService, import("@aalis/api-media").MediaService>;
|
|
8
|
+
memory: import("@aalis/core").OptionalUse<import("@aalis/api-memory").MemoryService, import("@aalis/api-memory").MemoryService>;
|
|
9
|
+
sessionManager: import("@aalis/core").OptionalUse<import("@aalis/api-session-manager").SessionManagerService, import("@aalis/api-session-manager").SessionManagerService>;
|
|
10
|
+
authority: import("@aalis/core").OptionalUse<import("@aalis/api-authority").AuthorityService, import("@aalis/api-authority").AuthorityService>;
|
|
10
11
|
}>;
|
|
11
12
|
export default _default;
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;AA+DA,wBAMG"}
|
package/dist/index.js
CHANGED
|
@@ -4,61 +4,99 @@
|
|
|
4
4
|
// 工具:
|
|
5
5
|
// 1. preview_image —— 在选图前用 vision 看清候选图(搜索结果标题常误导)
|
|
6
6
|
// 2. send_attachment —— 统一的出站附件接口:把 image/audio/video 发出去;
|
|
7
|
-
//
|
|
8
|
-
//
|
|
7
|
+
// 送达之后由 message-archive 记进会话历史(recordOutbound),
|
|
8
|
+
// 让"AI 之前发过的图/视频"能被 memory_recall 召回
|
|
9
|
+
//
|
|
10
|
+
// 出站中间件:带 markup 的正文(她的回复)里存储地址的媒体标记(<image|video|record url>)转成附件,与 send_attachment 同一份
|
|
11
|
+
// 判据,按回复所在那一轮的授权身份判(几个人时不带),转之前同样核文件头;只摘掉转成了附件的标记,别的留在正文里交给适配器。
|
|
9
12
|
//
|
|
10
13
|
// send_attachment 来源:url / storage_uri / history_ref(不接受裸本地路径);
|
|
11
|
-
//
|
|
14
|
+
// 存储库里的文件先过媒体判据(@aalis/api-media 的 mediaScopeOf:别的会话的媒体按会话管理的取用规则,本机文件按这一轮的
|
|
15
|
+
// 主体,多人的一轮逐个参与者判、有人过不了时发参与者审批),再读文件头核对格式(见 @aalis/util-file-signature)。
|
|
12
16
|
// 此插件不直接调用平台 API,而是 emit `outbound:message`(含 attachments[]);
|
|
13
17
|
// 由各 platform adapter(OneBot / WebUI)按自身能力处理结构化附件。
|
|
14
18
|
// ============================================================
|
|
15
|
-
import {
|
|
19
|
+
import { authority, originTurnOf } from '@aalis/api-authority';
|
|
20
|
+
import { hooks } from '@aalis/api-hooks';
|
|
21
|
+
import { historyMediaRefs, media, mediaRef, mediaScopeOf } from '@aalis/api-media';
|
|
16
22
|
import { memory } from '@aalis/api-memory';
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { tools } from '@aalis/api-tools';
|
|
23
|
+
import { sessionManager } from '@aalis/api-session-manager';
|
|
24
|
+
import { isStorageNotFound, isStorageUri, isWebUrl, storage } from '@aalis/api-storage';
|
|
25
|
+
import { actingIdentity, tools } from '@aalis/api-tools';
|
|
20
26
|
import { definePlugin, events, logger, optional } from '@aalis/core';
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
27
|
+
import { toSource } from '@aalis/schema-i18n';
|
|
28
|
+
import { awaitDelivery } from '@aalis/schema-message';
|
|
29
|
+
import { checkMediaHead, FILE_HEAD_BYTES } from '@aalis/util-file-signature';
|
|
30
|
+
import { t } from './texts.js';
|
|
23
31
|
/** preview_image 单张候选识别等待上限。preview 的目的就是"看清"图,
|
|
24
32
|
* 本地视觉模型(如 33B)单图常需 15-25s,必须给足预算,否则必然超时使 preview 形同虚设。 */
|
|
25
33
|
const PREVIEW_TIMEOUT_MS = 25_000;
|
|
26
|
-
/** 出站归档描述等待上限。该描述在后台计算、不阻塞发送,可放宽。 */
|
|
27
|
-
const ARCHIVE_DESCRIBE_TIMEOUT_MS = 25_000;
|
|
28
|
-
/** 视频描述等待上限(视频需抽帧+ASR,耗时远高于图片)。 */
|
|
29
|
-
const VIDEO_DESCRIBE_TIMEOUT_MS = 30_000;
|
|
30
34
|
/** preview_image 单次允许的候选数量上限。 */
|
|
31
35
|
const PREVIEW_MAX_CANDIDATES = 8;
|
|
32
|
-
/**
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
/** 过不了媒体判据时回给模型的话:先判后读,不存在与不是媒体也回这一句,拿它探测不出存储根里有什么 */
|
|
37
|
+
const OUT_OF_SCOPE = '这个文件不在这一轮能取的范围里:别的会话的媒体按这个会话的取用范围与开关;本机文件要这一轮里有 owner 的话、有别人时经她批准,或是 owner 授权的自动运行且会话里没有别人';
|
|
38
|
+
/** 判媒体归属与找 history_ref 回看的历史条数 */
|
|
39
|
+
const HISTORY_LIMIT = 200;
|
|
40
|
+
/** 回复正文里的媒体标记:与 onebot 适配器解析的写法相同 */
|
|
41
|
+
const MEDIA_MARKUP = /<(image|video|record)\s+url=["']([^"']*)["']\s*\/>/g;
|
|
42
|
+
const MARKUP_KIND = { image: 'image', video: 'video', record: 'audio' };
|
|
43
|
+
// tools 与 hooks 不入激活闸:工具与中间件登记走注册账本,提供者上线后自动补挂。
|
|
44
|
+
// 会话管理、权限与记忆给媒体判据用,缺席时判据按它的约定取值(不取别的会话的、主体是 other、没人是 owner、历史为空)。
|
|
36
45
|
const uses = {
|
|
37
46
|
tools: optional(tools),
|
|
47
|
+
hooks: optional(hooks),
|
|
38
48
|
events,
|
|
39
49
|
logger,
|
|
40
50
|
storage: optional(storage),
|
|
41
51
|
media: optional(media),
|
|
42
52
|
memory: optional(memory),
|
|
43
|
-
|
|
53
|
+
sessionManager: optional(sessionManager),
|
|
54
|
+
authority: optional(authority),
|
|
44
55
|
};
|
|
45
56
|
export default definePlugin({
|
|
46
57
|
name: '@aalis/plugin-image-sender',
|
|
47
|
-
displayName: '
|
|
58
|
+
displayName: t('displayName'),
|
|
48
59
|
subsystem: 'tools',
|
|
49
60
|
uses,
|
|
50
61
|
apply: registerImageSender,
|
|
51
62
|
});
|
|
52
63
|
function registerImageSender(caps) {
|
|
53
|
-
const { tools, events, logger, media, memory,
|
|
54
|
-
const storage =
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
64
|
+
const { tools, hooks, events, logger, media, memory, sessionManager, authority } = caps;
|
|
65
|
+
const storage = caps.storage.use;
|
|
66
|
+
/** 调用所在会话最近的历史:记忆不在时为空 */
|
|
67
|
+
async function recentHistory(sessionId) {
|
|
68
|
+
if (!memory.present)
|
|
69
|
+
return [];
|
|
70
|
+
const service = memory.use;
|
|
71
|
+
return service.getFullHistory
|
|
72
|
+
? service.getFullHistory(sessionId, HISTORY_LIMIT)
|
|
73
|
+
: service.getHistory(sessionId, HISTORY_LIMIT);
|
|
74
|
+
}
|
|
75
|
+
/** owner 判定:权限服务不在时恒为否 */
|
|
76
|
+
const isOwner = (platform, userId) => authority.present && authority.use.isOwner(platform, userId);
|
|
77
|
+
/** 媒体判据要的服务:每次判时按一次调用交给 mediaScopeOf(工具交这次调用,回复里的标记交它所在的那一轮) */
|
|
78
|
+
const scopeServices = { sessionManager, authority, history: recentHistory };
|
|
79
|
+
/**
|
|
80
|
+
* 在跑的各轮的输入:agent:turn:before 交来的那一份的引用(插进来的输入会追加到它上面),这一轮结束删掉。回复在这一轮结束
|
|
81
|
+
* 之前出站,按它的回合 id 取回,用那时的输入判回复里的标记
|
|
82
|
+
*/
|
|
83
|
+
const turnInputs = new Map();
|
|
84
|
+
hooks.use.middleware('agent:turn:before', async (data, next) => {
|
|
85
|
+
turnInputs.set(data.turnId, data.inputs);
|
|
86
|
+
try {
|
|
87
|
+
await next();
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
turnInputs.delete(data.turnId);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// 核对存储库内的文件能否按 kind 发送:只读文件头,按 kind 核对格式,不符拒发(存储根里还有配置、令牌、
|
|
94
|
+
// 记忆库等非媒体文件)。放行的交出 storage URI,送达形态由平台适配器决定:onebot 读回内容内联,超过内联上限
|
|
95
|
+
// 时再核对一次文件头才交宿主路径;预先换成 file:// 的话,适配器落不了盘的大文件只能原样透传、无从核对
|
|
58
96
|
async function loadStorageMedia(uri, kind) {
|
|
59
97
|
let head;
|
|
60
98
|
try {
|
|
61
|
-
head = await storage.readFileRange(uri, 0,
|
|
99
|
+
head = await storage.readFileRange(uri, 0, FILE_HEAD_BYTES);
|
|
62
100
|
}
|
|
63
101
|
catch (err) {
|
|
64
102
|
if (isStorageNotFound(err))
|
|
@@ -68,13 +106,12 @@ function registerImageSender(caps) {
|
|
|
68
106
|
const rejection = checkMediaHead(head, kind);
|
|
69
107
|
if (rejection)
|
|
70
108
|
return { ok: false, error: rejection };
|
|
71
|
-
|
|
72
|
-
return { ok: true, data: local ? `file://${local}` : uri };
|
|
109
|
+
return { ok: true, data: uri };
|
|
73
110
|
}
|
|
74
111
|
// ── preview_image ─────────────────────────────────────────────────────────
|
|
75
112
|
// 识别全靠 media:media 在场才挂,离场即撤(follow 在 media 上线 / 换人时各调一次,
|
|
76
113
|
// 返回的退订函数即清理),media 缺席的部署里 agent 看不到这个用不了的工具。
|
|
77
|
-
media.follow(service => tools.register({
|
|
114
|
+
media.follow(service => tools.use.register({
|
|
78
115
|
definition: {
|
|
79
116
|
type: 'function',
|
|
80
117
|
function: {
|
|
@@ -114,7 +151,7 @@ function registerImageSender(caps) {
|
|
|
114
151
|
const results = [];
|
|
115
152
|
for (let index = 0; index < urls.length; index++) {
|
|
116
153
|
const trimmed = urls[index].trim();
|
|
117
|
-
if (!
|
|
154
|
+
if (!isWebUrl(trimmed)) {
|
|
118
155
|
results.push({ index, url: trimmed, ok: false, error: 'url 必须是 http/https' });
|
|
119
156
|
continue;
|
|
120
157
|
}
|
|
@@ -136,7 +173,7 @@ function registerImageSender(caps) {
|
|
|
136
173
|
},
|
|
137
174
|
}));
|
|
138
175
|
// ── send_attachment ───────────────────────────────────────────────────────
|
|
139
|
-
tools.register({
|
|
176
|
+
tools.use.register({
|
|
140
177
|
definition: {
|
|
141
178
|
type: 'function',
|
|
142
179
|
function: {
|
|
@@ -146,10 +183,14 @@ function registerImageSender(caps) {
|
|
|
146
183
|
'kind 必填,指定附件类型;来源三选一:\n' +
|
|
147
184
|
' - url:网络资源 URL(http/https)。\n' +
|
|
148
185
|
' - storage_uri:存储库内的资源 URI(如 data:/images/xxx)。\n' +
|
|
149
|
-
' - history_ref
|
|
186
|
+
' - history_ref:本会话历史消息中的引用([图片/音频/视频: ... | ref:xxx] 中完整的 xxx),\n' +
|
|
150
187
|
' 用于"把之前那条媒体重发/转发回去"。\n' +
|
|
188
|
+
'storage_uri 能指向本会话收到或产生的媒体;别的会话的媒体按 owner 给这个会话设的取用范围与开关;' +
|
|
189
|
+
'不属于任何会话的本机文件要这一轮里有 owner 的话(有别人的话一起进来时要她批),' +
|
|
190
|
+
'或这一轮是按 owner 的授权自动运行的(如她建的定时任务)而所在会话里没有别人。history_ref 只在本会话历史里找。\n' +
|
|
151
191
|
'建议流程(图片):search_images 拿候选 URL →(有 preview_image 时可先看清内容)→ send_attachment 选其一发出。\n' +
|
|
152
|
-
'
|
|
192
|
+
'只有返回 ok:true 才能说已发送;返回 error 时没有成功确认,下载失败可改选另一张图片,不要反复重发同一失效地址。\n' +
|
|
193
|
+
'若想重发自己之前在本会话发过的媒体,先用 memory_recall 按描述检索历史,从命中消息里找到 ref 再传 history_ref。\n' +
|
|
153
194
|
'注意:本工具不发送任何文字。如需配文,请把文字写在你本轮最终输出的 message 字段里——' +
|
|
154
195
|
'不要在 message 中重复媒体描述。',
|
|
155
196
|
parameters: {
|
|
@@ -164,7 +205,7 @@ function registerImageSender(caps) {
|
|
|
164
205
|
storage_uri: { type: 'string', description: '存储库内资源 URI(如 data:/images/xxx)。' },
|
|
165
206
|
history_ref: {
|
|
166
207
|
type: 'string',
|
|
167
|
-
description: '
|
|
208
|
+
description: '本会话历史消息中的引用路径([... | ref:xxx] 中完整的 xxx)。',
|
|
168
209
|
},
|
|
169
210
|
},
|
|
170
211
|
required: ['kind'],
|
|
@@ -184,7 +225,7 @@ function registerImageSender(caps) {
|
|
|
184
225
|
let via = 'url';
|
|
185
226
|
try {
|
|
186
227
|
if (url) {
|
|
187
|
-
if (!
|
|
228
|
+
if (!isWebUrl(url)) {
|
|
188
229
|
return JSON.stringify({ error: 'url 必须是 http/https 开头' });
|
|
189
230
|
}
|
|
190
231
|
data = url;
|
|
@@ -192,60 +233,68 @@ function registerImageSender(caps) {
|
|
|
192
233
|
via = 'url';
|
|
193
234
|
}
|
|
194
235
|
else if (storageUri) {
|
|
195
|
-
//
|
|
196
|
-
|
|
197
|
-
|
|
236
|
+
// 先判后读:判据、读取与附件引用用同一个规整后的地址
|
|
237
|
+
const uri = mediaRef(storageUri);
|
|
238
|
+
if (!uri || !isStorageUri(uri)) {
|
|
239
|
+
return JSON.stringify({ error: 'storage_uri 要写存储地址(如 data:/images/…),不能写本机路径' });
|
|
240
|
+
}
|
|
241
|
+
if (!(await mediaScopeOf(callCtx, scopeServices)(uri)))
|
|
242
|
+
return JSON.stringify({ error: OUT_OF_SCOPE });
|
|
243
|
+
const loaded = await loadStorageMedia(uri, kind);
|
|
198
244
|
if (!loaded.ok)
|
|
199
245
|
return JSON.stringify({ error: loaded.error });
|
|
200
246
|
data = loaded.data;
|
|
201
|
-
|
|
202
|
-
refTag = storageUri;
|
|
247
|
+
refTag = uri;
|
|
203
248
|
via = 'storage_uri';
|
|
204
249
|
}
|
|
205
250
|
else if (historyRef) {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
251
|
+
refTag = historyRef.replace(/^ref:/, '').trim();
|
|
252
|
+
// 网址照旧当 url 用;其余只在调用所在会话历史里系统记下的引用中按全等找,找到的与 storage_uri 过同一份判据:
|
|
253
|
+
// 会话媒体放行,历史里记过的本机文件照样按本机文件判(按地址取到的是此刻的内容)
|
|
254
|
+
const ref = mediaRef(refTag);
|
|
255
|
+
if (ref && !isStorageUri(ref)) {
|
|
256
|
+
data = ref;
|
|
257
|
+
}
|
|
258
|
+
else if (!ref || !historyMediaRefs(await recentHistory(callCtx.sessionId)).includes(ref)) {
|
|
259
|
+
return JSON.stringify({ error: `未在本会话历史中找到引用: ${historyRef}` });
|
|
260
|
+
}
|
|
261
|
+
else if (!(await mediaScopeOf(callCtx, scopeServices)(ref))) {
|
|
262
|
+
return JSON.stringify({ error: OUT_OF_SCOPE });
|
|
211
263
|
}
|
|
212
264
|
else {
|
|
213
|
-
|
|
214
|
-
// file://、data URI 等来源不在存储库内,读不了文件头,无从核对格式
|
|
215
|
-
const uri = toStorageUri(found);
|
|
216
|
-
if (HOST_ABSOLUTE_PATH.test(found) || !isStorageUri(uri)) {
|
|
217
|
-
return JSON.stringify({ error: `引用 ${historyRef} 的来源不在存储库内,无法核对格式,不能发送` });
|
|
218
|
-
}
|
|
219
|
-
const loaded = await loadStorageMedia(uri, kind);
|
|
265
|
+
const loaded = await loadStorageMedia(ref, kind);
|
|
220
266
|
if (!loaded.ok)
|
|
221
267
|
return JSON.stringify({ error: loaded.error });
|
|
222
268
|
data = loaded.data;
|
|
223
269
|
}
|
|
224
|
-
refTag = historyRef.replace(/^ref:/, '').trim();
|
|
225
270
|
via = 'history_ref';
|
|
226
271
|
}
|
|
227
272
|
else {
|
|
228
273
|
return JSON.stringify({ error: '必须提供 url / storage_uri / history_ref 之一' });
|
|
229
274
|
}
|
|
230
|
-
//
|
|
231
|
-
//
|
|
232
|
-
|
|
233
|
-
// 不阻塞发送,且用稳定 ref 规避平台落盘改写 data 的竞态。
|
|
234
|
-
const attachment = {
|
|
235
|
-
kind,
|
|
236
|
-
data,
|
|
237
|
-
// 归档承载:ref 随事件携带,由全局出站归档统一入档(见下方 outbound:message 监听)。
|
|
238
|
-
// history_ref 重发标记 skipArchive,避免重复入档 / 向量库膨胀。
|
|
239
|
-
ref: refTag ?? data,
|
|
240
|
-
skipArchive: via === 'history_ref',
|
|
241
|
-
};
|
|
275
|
+
// 等待传输确认,不等识图:送达之后由 message-archive 记进会话历史,网址的图在后台补描述。
|
|
276
|
+
// ref 是稳定的地址,平台落盘后改写 data 也不影响记进历史的那一份
|
|
277
|
+
const attachment = { kind, data, ref: refTag ?? data };
|
|
242
278
|
const outgoing = {
|
|
243
279
|
sessionId: callCtx.sessionId,
|
|
280
|
+
platform: callCtx.platform,
|
|
244
281
|
content: '',
|
|
245
282
|
attachments: [attachment],
|
|
246
283
|
source: 'agent',
|
|
284
|
+
turnId: callCtx.turnId,
|
|
285
|
+
callId: callCtx.callId,
|
|
247
286
|
};
|
|
248
|
-
events.emit('outbound:message', outgoing);
|
|
287
|
+
await events.use.emit('outbound:message', outgoing);
|
|
288
|
+
if (!outgoing.delivery)
|
|
289
|
+
return JSON.stringify({ error: '没有目标适配器确认附件发送,请勿声称已发出' });
|
|
290
|
+
const result = await awaitDelivery(outgoing.delivery, callCtx.signal);
|
|
291
|
+
if (!result)
|
|
292
|
+
return JSON.stringify({ error: '附件仍在发送,结果未确认,请勿重发' });
|
|
293
|
+
if (!result.ok) {
|
|
294
|
+
return JSON.stringify({
|
|
295
|
+
error: result.unconfirmed ? '附件发送结果未知(可能已经送达),请勿重发' : toSource(result.error),
|
|
296
|
+
});
|
|
297
|
+
}
|
|
249
298
|
return JSON.stringify({ ok: true, sent: { kind, via, ref: refTag } });
|
|
250
299
|
}
|
|
251
300
|
catch (err) {
|
|
@@ -253,160 +302,63 @@ function registerImageSender(caps) {
|
|
|
253
302
|
}
|
|
254
303
|
},
|
|
255
304
|
});
|
|
256
|
-
logger.info('[image-sender] 工具 send_attachment 已注册(preview_image 随 media 在场注册)');
|
|
257
|
-
// ──
|
|
258
|
-
//
|
|
259
|
-
//
|
|
260
|
-
//
|
|
261
|
-
//
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
continue;
|
|
270
|
-
if (att.kind !== 'image' && att.kind !== 'audio' && att.kind !== 'video')
|
|
271
|
-
continue;
|
|
272
|
-
// 用稳定 ref(生产者声明)而非 att.data:避免 onebot 等适配器落盘后改写 data。
|
|
273
|
-
const ref = att.ref ?? att.data;
|
|
274
|
-
const kind = att.kind;
|
|
275
|
-
const carried = att.description ?? '';
|
|
276
|
-
// 后台异步:监听器同步返回,避免阻塞出站事件链(emit 串行 await,阻塞会拖慢 onebot/webui 发送)。
|
|
277
|
-
// 描述用宽松超时在背景补齐,让档案 [图片: desc | ref] 能被 memory_recall 命中。
|
|
278
|
-
void (async () => {
|
|
279
|
-
let desc = carried;
|
|
280
|
-
if (!desc && (kind === 'image' || kind === 'video') && /^https?:\/\//i.test(ref)) {
|
|
281
|
-
desc = await safeDescribeMedia({ media, logger }, kind, ref);
|
|
282
|
-
}
|
|
283
|
-
await archiveOutboundAttachment({ archive, logger }, msg.sessionId, ref, desc, kind);
|
|
284
|
-
})();
|
|
285
|
-
}
|
|
305
|
+
logger.use.info('[image-sender] 工具 send_attachment 已注册(preview_image 随 media 在场注册)');
|
|
306
|
+
// ── 带 markup 的正文里的媒体标记:存储地址的转成附件 ─────────────────────────────────
|
|
307
|
+
// 适配器只解析带 markup 的正文(她的回复);onebot 只把网址的标记经受保护下载与文件头核对后内联,其余地址的去掉并报投递失败,
|
|
308
|
+
// 存储里的媒体要靠这里转成附件才发得出。存储地址过与 send_attachment 同一份判据,没有可挂审批的工具调用,按回复所在那一轮
|
|
309
|
+
// 判:按回合 id 取回这一轮的输入拼出这一轮(originTurnOf),授权身份取 actingIdentity(只有一位参与者时是他,几个人时不带:
|
|
310
|
+
// 别人的私聊取不到,本机文件取不到);认不出这一轮的(不是回合里的回复)不带授权身份判。转之前与 send_attachment 一样核文件头。
|
|
311
|
+
// 这里只摘掉转成了附件的标记:不过判据、读不出、不是对应媒体的与别的写法(网址、file://、本机路径、data URI 等)都留在正文里,
|
|
312
|
+
// 去不去掉由适配器定;摘掉标记后两边的文字拼出的新标记同样留给它,它在解析出的消息段上判。转出的附件与别的附件一样,送达
|
|
313
|
+
// 之后记进会话历史。网关缺席时出站不经这条链,存储地址的标记由适配器去掉、发不出
|
|
314
|
+
hooks.use.middleware('outbound:dispatch', async ({ message }, next) => {
|
|
315
|
+
if (message.markup)
|
|
316
|
+
await markupToAttachments(message);
|
|
317
|
+
await next();
|
|
286
318
|
});
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
}
|
|
292
|
-
/** 调 media.describeImage,超时或失败返回空串(不阻塞发送)。 */
|
|
293
|
-
async function safeDescribe(caps, imageData) {
|
|
294
|
-
const service = caps.media.current;
|
|
295
|
-
if (!service?.describeImage)
|
|
296
|
-
return '';
|
|
297
|
-
try {
|
|
298
|
-
const desc = await Promise.race([
|
|
299
|
-
service.describeImage(imageData),
|
|
300
|
-
new Promise((_resolve, reject) => setTimeout(() => reject(new Error('vision 超时')), ARCHIVE_DESCRIBE_TIMEOUT_MS)),
|
|
301
|
-
]);
|
|
302
|
-
return (desc ?? '').trim();
|
|
303
|
-
}
|
|
304
|
-
catch (err) {
|
|
305
|
-
caps.logger.debug(`[image-sender] vision 失败,跳过描述: ${err instanceof Error ? err.message : err}`);
|
|
306
|
-
return '';
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
/** 调 media.describeVideo,超时或失败返回空串(视频抽帧耗时长,用更宽松的超时)。 */
|
|
310
|
-
async function safeDescribeVideo(caps, videoUrl) {
|
|
311
|
-
const service = caps.media.current;
|
|
312
|
-
if (!service?.describeVideo)
|
|
313
|
-
return '';
|
|
314
|
-
try {
|
|
315
|
-
const desc = await Promise.race([
|
|
316
|
-
service.describeVideo(videoUrl),
|
|
317
|
-
new Promise((_resolve, reject) => setTimeout(() => reject(new Error('video 描述超时')), VIDEO_DESCRIBE_TIMEOUT_MS)),
|
|
318
|
-
]);
|
|
319
|
-
return (desc ?? '').trim();
|
|
320
|
-
}
|
|
321
|
-
catch (err) {
|
|
322
|
-
caps.logger.debug(`[image-sender] video 描述失败,跳过: ${err instanceof Error ? err.message : err}`);
|
|
323
|
-
return '';
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
/** 把 AI 自己发出的图/语音/视频入档为一条 assistant 消息,让 memory_recall 能找到。 */
|
|
327
|
-
async function archiveOutboundAttachment(caps, sessionId, ref, description, kind) {
|
|
328
|
-
const archive = caps.archive.current;
|
|
329
|
-
if (!archive?.saveMessage)
|
|
330
|
-
return;
|
|
331
|
-
const attachKind = kind === 'video' ? AttachmentRefKind.Video : kind === 'audio' ? AttachmentRefKind.Audio : AttachmentRefKind.Image;
|
|
332
|
-
const msgKind = kind === 'video'
|
|
333
|
-
? WellKnownKinds.OutboundVideo
|
|
334
|
-
: kind === 'audio'
|
|
335
|
-
? WellKnownKinds.OutboundAudio
|
|
336
|
-
: WellKnownKinds.OutboundImage;
|
|
337
|
-
const label = kind === 'video' ? '视频' : kind === 'audio' ? '语音' : '图片';
|
|
338
|
-
const tag = formatAttachmentRef({ kind: attachKind, desc: description, ref });
|
|
339
|
-
const message = {
|
|
340
|
-
role: 'assistant',
|
|
341
|
-
kind: msgKind,
|
|
342
|
-
content: tag,
|
|
343
|
-
timestamp: Date.now(),
|
|
344
|
-
metadata: { source: 'image-sender', ref },
|
|
345
|
-
};
|
|
346
|
-
try {
|
|
347
|
-
await archive.saveMessage(sessionId, message, {
|
|
348
|
-
debugLabel: `[image-sender] 已入档发送的${label}`,
|
|
319
|
+
async function markupToAttachments(message) {
|
|
320
|
+
// 各标记的存储地址:不是存储地址的为 undefined
|
|
321
|
+
const tags = [...message.content.matchAll(MEDIA_MARKUP)].map(([, tag, url]) => {
|
|
322
|
+
const ref = mediaRef(url);
|
|
323
|
+
return { kind: MARKUP_KIND[tag], ref: ref && isStorageUri(ref) ? ref : undefined };
|
|
349
324
|
});
|
|
325
|
+
if (!tags.some(({ ref }) => ref))
|
|
326
|
+
return;
|
|
327
|
+
const turn = turnOf(message);
|
|
328
|
+
const inScope = mediaScopeOf({ ...turn, approveFor: async (check) => check(actingIdentity(turn)) }, scopeServices);
|
|
329
|
+
// 各标记转成的附件:没转成的为 undefined,标记留在正文里
|
|
330
|
+
const converted = [];
|
|
331
|
+
for (const { kind, ref } of tags) {
|
|
332
|
+
converted.push(ref && (await markupMediaAllowed(ref, kind, inScope)) ? { kind, data: ref } : undefined);
|
|
333
|
+
}
|
|
334
|
+
let i = 0;
|
|
335
|
+
message.content = message.content.replace(MEDIA_MARKUP, whole => (converted[i++] ? '' : whole));
|
|
336
|
+
message.attachments = [...(message.attachments ?? []), ...converted.filter(att => att !== undefined)];
|
|
350
337
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
const service = memory.current;
|
|
361
|
-
if (!service)
|
|
362
|
-
return null;
|
|
363
|
-
const history = service.getFullHistory
|
|
364
|
-
? await service.getFullHistory(sessionId, 200)
|
|
365
|
-
: await service.getHistory(sessionId, 200);
|
|
366
|
-
const normalized = ref.replace(/^ref:/, '').trim();
|
|
367
|
-
// http(s) ref:直接当 URL 用
|
|
368
|
-
if (normalized.startsWith('http://') || normalized.startsWith('https://')) {
|
|
369
|
-
return normalized;
|
|
370
|
-
}
|
|
371
|
-
// storage URI / 历史相对路径:归一化后 stat;命中即用,未命中 fallthrough 到子串匹配。
|
|
372
|
-
// 完整相对路径 `data/images/x.jpg` → `data:/images/x.jpg` 能直接命中;
|
|
373
|
-
// 单段 hash(如 `abc123.jpg`)归一化成 `data:/abc123.jpg` stat 失败,正确回落子串匹配。
|
|
374
|
-
const asUri = normalized.includes(':/') ? normalized : toStorageUri(normalized);
|
|
375
|
-
try {
|
|
376
|
-
await storage.stat(asUri);
|
|
377
|
-
return asUri;
|
|
378
|
-
}
|
|
379
|
-
catch {
|
|
380
|
-
// fallthrough 到历史子串匹配
|
|
338
|
+
/**
|
|
339
|
+
* 出站消息所在的那一轮:按回合 id 取回在跑的那一轮的输入拼出,会话取出站的目标会话(取用范围按它判);认不出的只有会话、
|
|
340
|
+
* 没有授权身份
|
|
341
|
+
*/
|
|
342
|
+
function turnOf(message) {
|
|
343
|
+
const [first, ...rest] = (message.turnId && turnInputs.get(message.turnId)) || [];
|
|
344
|
+
return first
|
|
345
|
+
? { ...originTurnOf([first.message, ...rest.map(input => input.message)], isOwner), sessionId: message.sessionId }
|
|
346
|
+
: { sessionId: message.sessionId, participants: [] };
|
|
381
347
|
}
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
348
|
+
/**
|
|
349
|
+
* 回复里存储地址的标记能不能转成附件:先过判据,再按 kind 核文件头。判不出、读不出(如读历史出错、根不存在)的按不能,标记
|
|
350
|
+
* 留在正文里
|
|
351
|
+
*/
|
|
352
|
+
async function markupMediaAllowed(uri, kind, inScope) {
|
|
353
|
+
try {
|
|
354
|
+
if (!(await inScope(uri)))
|
|
355
|
+
return false;
|
|
356
|
+
return (await loadStorageMedia(uri, kind)).ok;
|
|
390
357
|
}
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
return att.data;
|
|
395
|
-
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
logger.use.warn(`[image-sender] 回复里的媒体标记判不出归属或读不出,不转成附件: ${err instanceof Error ? err.message : err}`);
|
|
360
|
+
return false;
|
|
396
361
|
}
|
|
397
362
|
}
|
|
398
|
-
return null;
|
|
399
|
-
}
|
|
400
|
-
/** 如果 storage 支持 resolveLocalPath,则解析为本地绝对路径供下游 file:// 直链使用。 */
|
|
401
|
-
async function tryResolveLocal(storage, uri) {
|
|
402
|
-
if (typeof storage.resolveLocalPath !== 'function')
|
|
403
|
-
return null;
|
|
404
|
-
try {
|
|
405
|
-
const p = await storage.resolveLocalPath(uri, 'read');
|
|
406
|
-
return p ?? null;
|
|
407
|
-
}
|
|
408
|
-
catch {
|
|
409
|
-
return null;
|
|
410
|
-
}
|
|
411
363
|
}
|
|
412
364
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":";;;AAGA,wBAEG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,eAAe,YAAY,EAAU,CAAC;IACpC,WAAW,EAAE,eAAe;CAC7B,CAAC,CAAC"}
|
package/dist/texts.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texts.d.ts","sourceRoot":"","sources":["../src/texts.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM;;CAEF,CAAC;AACX,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC;AAEnC,eAAO,MAAM,CAAC;;EAAwG,CAAC"}
|
package/dist/texts.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// 本插件自己的原文字典:显示名
|
|
2
|
+
import { defineTexts } from '@aalis/schema-i18n';
|
|
3
|
+
import en from './locales/en.js';
|
|
4
|
+
const SOURCE = {
|
|
5
|
+
displayName: '图片发送',
|
|
6
|
+
};
|
|
7
|
+
export const t = defineTexts({ ns: '@aalis/plugin-image-sender', language: 'zh-CN', source: SOURCE, locales: { en } });
|
|
8
|
+
//# sourceMappingURL=texts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texts.js","sourceRoot":"","sources":["../src/texts.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEjC,MAAM,MAAM,GAAG;IACb,WAAW,EAAE,MAAM;CACX,CAAC;AAGX,MAAM,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,4BAA4B,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aalis/plugin-image-sender",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -24,27 +24,35 @@
|
|
|
24
24
|
"dist"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@aalis/schema-
|
|
28
|
-
"@aalis/
|
|
29
|
-
"@aalis/api-
|
|
30
|
-
"@aalis/api-
|
|
31
|
-
"@aalis/api-
|
|
32
|
-
"@aalis/api-
|
|
27
|
+
"@aalis/schema-i18n": ">=0.1.0 <1.0.0",
|
|
28
|
+
"@aalis/schema-message": ">=0.11.0 <1.0.0",
|
|
29
|
+
"@aalis/api-authority": ">=0.12.0 <1.0.0",
|
|
30
|
+
"@aalis/api-gateway": ">=0.10.0 <1.0.0",
|
|
31
|
+
"@aalis/api-hooks": ">=0.3.0 <1.0.0",
|
|
32
|
+
"@aalis/api-media": ">=0.13.0 <1.0.0",
|
|
33
|
+
"@aalis/api-memory": ">=0.9.0 <1.0.0",
|
|
34
|
+
"@aalis/api-session-manager": ">=0.12.0 <1.0.0",
|
|
35
|
+
"@aalis/api-storage": ">=0.9.0 <1.0.0",
|
|
36
|
+
"@aalis/api-tools": ">=0.12.0 <1.0.0",
|
|
37
|
+
"@aalis/util-file-signature": ">=0.1.0 <1.0.0"
|
|
33
38
|
},
|
|
34
39
|
"devDependencies": {
|
|
35
40
|
"@types/node": "^22.0.0",
|
|
36
41
|
"typescript": "^5.7.0",
|
|
37
|
-
"@aalis/core": "0.
|
|
42
|
+
"@aalis/core": "0.21.0",
|
|
43
|
+
"@aalis/api-agent": "0.11.0"
|
|
38
44
|
},
|
|
39
45
|
"peerDependencies": {
|
|
40
|
-
"@aalis/core": ">=0.
|
|
46
|
+
"@aalis/core": ">=0.21.0 <1.0.0"
|
|
41
47
|
},
|
|
42
48
|
"aalis": {
|
|
43
49
|
"service": {
|
|
44
50
|
"optional": [
|
|
51
|
+
"authority",
|
|
52
|
+
"hooks",
|
|
45
53
|
"memory",
|
|
46
54
|
"media",
|
|
47
|
-
"
|
|
55
|
+
"session-manager",
|
|
48
56
|
"storage",
|
|
49
57
|
"tools"
|
|
50
58
|
],
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/** 可发送的附件类型。 */
|
|
2
|
-
export type MediaKind = 'image' | 'audio' | 'video';
|
|
3
|
-
/**
|
|
4
|
-
* 认定格式要读的文件头长度:与 file(1) 在前 4 KiB 里找 Matroska DocType 的范围一致,也容得下 ftyp 盒的
|
|
5
|
-
* 兼容品牌表;其余签名都在前 20 字节内。
|
|
6
|
-
*/
|
|
7
|
-
export declare const MEDIA_HEAD_BYTES = 4096;
|
|
8
|
-
/**
|
|
9
|
-
* 核对文件头是否为所请求 kind 的受支持格式。相符返回 null;不符返回给模型的拒发说明:
|
|
10
|
-
* 不是任何受支持的媒体格式时说明不能按该类型发送,是别类媒体时说出检测到的格式与该用的 kind。
|
|
11
|
-
*/
|
|
12
|
-
export declare function checkMediaHead(head: Uint8Array, kind: MediaKind): string | null;
|
|
13
|
-
//# sourceMappingURL=media-signature.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media-signature.d.ts","sourceRoot":"","sources":["../src/media-signature.ts"],"names":[],"mappings":"AASA,gBAAgB;AAChB,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAoDrC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAY/E"}
|
package/dist/media-signature.js
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// media-signature.ts — 按文件头核对附件格式
|
|
3
|
-
//
|
|
4
|
-
// 存储根里除了媒体,还有配置、令牌、记忆库、日志;只凭 kind 与路径发送,
|
|
5
|
-
// 这些文件会被当成图片发出去。send_attachment 从本地取文件时先读文件开头的
|
|
6
|
-
// 字节,按下表的格式签名认定格式,只有落在所请求 kind 的白名单里才放行。
|
|
7
|
-
// 签名依据各格式的规范,并与 file(1) 的 magic 库对照(SILK 不在该库里)。
|
|
8
|
-
// ============================================================
|
|
9
|
-
/**
|
|
10
|
-
* 认定格式要读的文件头长度:与 file(1) 在前 4 KiB 里找 Matroska DocType 的范围一致,也容得下 ftyp 盒的
|
|
11
|
-
* 兼容品牌表;其余签名都在前 20 字节内。
|
|
12
|
-
*/
|
|
13
|
-
export const MEDIA_HEAD_BYTES = 4096;
|
|
14
|
-
const KIND_LABEL = { image: '图片', audio: '音频', video: '视频' };
|
|
15
|
-
/** BMP 偏移 14 处 DIB 头长度的合法取值(file(1) 认的各版本);只有 'BM' 两字节太弱,文本也可能以它开头。 */
|
|
16
|
-
const BMP_DIB_HEADER_SIZES = new Set([12, 16, 24, 40, 48, 52, 56, 64, 108, 124]);
|
|
17
|
-
/** AMR 文件存储格式的魔数:单声道窄带、宽带与各自的多声道版本(RFC 4867 §5)。 */
|
|
18
|
-
const AMR_MAGICS = ['#!AMR\n', '#!AMR-WB\n', '#!AMR_MC1.0\n', '#!AMR-WB_MC1.0\n'];
|
|
19
|
-
const AVIF_BRANDS = new Set(['avif', 'avis']);
|
|
20
|
-
/** HEIF 的图片与图片序列品牌(ISO/IEC 23008-12):HEVC 编码的 heic 系与通用的 mif1、msf1。 */
|
|
21
|
-
const HEIF_BRANDS = new Set(['heic', 'heix', 'heim', 'heis', 'hevc', 'hevx', 'hevm', 'hevs', 'mif1', 'msf1']);
|
|
22
|
-
const M4A_BRANDS = new Set(['M4A ', 'M4B ', 'M4P ']);
|
|
23
|
-
const SIGNATURES = [
|
|
24
|
-
{ kind: 'image', format: 'PNG', matches: h => hasBytes(h, 0, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]) },
|
|
25
|
-
// SOI 标记 FFD8 之后紧跟下一个标记的 FF
|
|
26
|
-
{ kind: 'image', format: 'JPEG', matches: h => hasBytes(h, 0, [0xff, 0xd8, 0xff]) },
|
|
27
|
-
{ kind: 'image', format: 'GIF', matches: h => hasAscii(h, 0, 'GIF87a') || hasAscii(h, 0, 'GIF89a') },
|
|
28
|
-
{ kind: 'image', format: 'WebP', matches: h => isRiff(h, 'WEBP') },
|
|
29
|
-
{
|
|
30
|
-
kind: 'image',
|
|
31
|
-
format: 'BMP',
|
|
32
|
-
matches: h => hasAscii(h, 0, 'BM') && h.length >= 18 && BMP_DIB_HEADER_SIZES.has(readUint32LE(h, 14)),
|
|
33
|
-
},
|
|
34
|
-
{ kind: 'image', format: 'AVIF', matches: h => isoMediaFormat(h) === 'AVIF' },
|
|
35
|
-
{ kind: 'image', format: 'HEIC', matches: h => isoMediaFormat(h) === 'HEIC' },
|
|
36
|
-
{ kind: 'audio', format: 'MP3', matches: h => isId3v2(h) || isMp3Frame(h) },
|
|
37
|
-
{ kind: 'audio', format: 'WAV', matches: h => isRiff(h, 'WAVE') },
|
|
38
|
-
// 页头捕获模式 'OggS' 加结构版本 0(RFC 3533)
|
|
39
|
-
{ kind: 'audio', format: 'OGG', matches: h => hasBytes(h, 0, [0x4f, 0x67, 0x67, 0x53, 0x00]) },
|
|
40
|
-
{ kind: 'audio', format: 'FLAC', matches: h => hasAscii(h, 0, 'fLaC') },
|
|
41
|
-
{ kind: 'audio', format: 'AMR', matches: h => AMR_MAGICS.some(m => hasAscii(h, 0, m)) },
|
|
42
|
-
// QQ 语音的 SILK 前面可能多一个 0x02
|
|
43
|
-
{
|
|
44
|
-
kind: 'audio',
|
|
45
|
-
format: 'SILK',
|
|
46
|
-
matches: h => hasAscii(h, 0, '#!SILK_V3') || (h[0] === 0x02 && hasAscii(h, 1, '#!SILK_V3')),
|
|
47
|
-
},
|
|
48
|
-
{ kind: 'audio', format: 'M4A', matches: h => isoMediaFormat(h) === 'M4A' },
|
|
49
|
-
{ kind: 'video', format: 'MP4', matches: h => isoMediaFormat(h) === 'MP4' },
|
|
50
|
-
{ kind: 'video', format: 'MOV', matches: h => isoMediaFormat(h) === 'MOV' },
|
|
51
|
-
{ kind: 'video', format: 'WebM', matches: h => ebmlDocType(h) === 'webm' },
|
|
52
|
-
{ kind: 'video', format: 'MKV', matches: h => ebmlDocType(h) === 'matroska' },
|
|
53
|
-
{ kind: 'video', format: 'AVI', matches: h => isRiff(h, 'AVI ') },
|
|
54
|
-
];
|
|
55
|
-
/**
|
|
56
|
-
* 核对文件头是否为所请求 kind 的受支持格式。相符返回 null;不符返回给模型的拒发说明:
|
|
57
|
-
* 不是任何受支持的媒体格式时说明不能按该类型发送,是别类媒体时说出检测到的格式与该用的 kind。
|
|
58
|
-
*/
|
|
59
|
-
export function checkMediaHead(head, kind) {
|
|
60
|
-
const detected = SIGNATURES.find(s => s.matches(head));
|
|
61
|
-
if (!detected) {
|
|
62
|
-
const supported = SIGNATURES.filter(s => s.kind === kind)
|
|
63
|
-
.map(s => s.format)
|
|
64
|
-
.join('、');
|
|
65
|
-
return `文件不是受支持的${KIND_LABEL[kind]}格式(${supported}),不能按 ${kind} 发送`;
|
|
66
|
-
}
|
|
67
|
-
if (detected.kind !== kind) {
|
|
68
|
-
return `文件是 ${detected.format} ${KIND_LABEL[detected.kind]},不能按 ${kind} 发送;请改用 kind=${detected.kind} 重新发送`;
|
|
69
|
-
}
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* ISO 基础媒体文件(ISO/IEC 14496-12)按 ftyp 盒的品牌分类。AVIF 与 HEIF 在主品牌与兼容品牌里都找:
|
|
74
|
-
* AVIF 文件的主品牌也可能写 mif1,avif 只列在兼容品牌里。M4A 与 MOV 只看主品牌:iTunes 的 M4V 视频
|
|
75
|
-
* 会把 'M4A ' 列进兼容品牌。其余品牌(isom、mp41、mp42、3gp 系等)都归 MP4 家族的视频容器。
|
|
76
|
-
*/
|
|
77
|
-
function isoMediaFormat(h) {
|
|
78
|
-
if (h.length < 12 || !hasAscii(h, 4, 'ftyp'))
|
|
79
|
-
return null;
|
|
80
|
-
const major = ascii(h, 8, 4);
|
|
81
|
-
const boxEnd = Math.min(readUint32BE(h, 0), h.length);
|
|
82
|
-
const brands = [major];
|
|
83
|
-
for (let offset = 16; offset + 4 <= boxEnd; offset += 4)
|
|
84
|
-
brands.push(ascii(h, offset, 4));
|
|
85
|
-
if (brands.some(b => AVIF_BRANDS.has(b)))
|
|
86
|
-
return 'AVIF';
|
|
87
|
-
if (brands.some(b => HEIF_BRANDS.has(b)))
|
|
88
|
-
return 'HEIC';
|
|
89
|
-
if (M4A_BRANDS.has(major))
|
|
90
|
-
return 'M4A';
|
|
91
|
-
if (major === 'qt ')
|
|
92
|
-
return 'MOV';
|
|
93
|
-
return 'MP4';
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Matroska 与 WebM 同为 EBML 容器(魔数 1A45DFA3),靠 DocType 元素(ID 0x4282)区分:
|
|
97
|
-
* 与 file(1) 一样在文件头里找到它,跳过一字节长度后比对。
|
|
98
|
-
*/
|
|
99
|
-
function ebmlDocType(h) {
|
|
100
|
-
if (!hasBytes(h, 0, [0x1a, 0x45, 0xdf, 0xa3]))
|
|
101
|
-
return null;
|
|
102
|
-
for (let i = 4; i + 1 < h.length; i++) {
|
|
103
|
-
if (h[i] !== 0x42 || h[i + 1] !== 0x82)
|
|
104
|
-
continue;
|
|
105
|
-
if (hasAscii(h, i + 3, 'webm'))
|
|
106
|
-
return 'webm';
|
|
107
|
-
if (hasAscii(h, i + 3, 'matroska'))
|
|
108
|
-
return 'matroska';
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
/** ID3v2 标签:'ID3' 后接主版本号(现有 2、3、4 三版)与不为 FF 的修订号。 */
|
|
114
|
-
function isId3v2(h) {
|
|
115
|
-
return hasAscii(h, 0, 'ID3') && h.length >= 5 && h[3] >= 2 && h[3] <= 4 && h[4] !== 0xff;
|
|
116
|
-
}
|
|
117
|
-
/** MPEG 音频帧头:11 位同步,版本不为保留值 01,层为 Layer III(01),码率索引不为 1111,采样率索引不为 11。 */
|
|
118
|
-
function isMp3Frame(h) {
|
|
119
|
-
if (h.length < 3 || h[0] !== 0xff || (h[1] & 0xe0) !== 0xe0)
|
|
120
|
-
return false;
|
|
121
|
-
const version = (h[1] >> 3) & 0x03;
|
|
122
|
-
const layer = (h[1] >> 1) & 0x03;
|
|
123
|
-
const bitrateIndex = h[2] >> 4;
|
|
124
|
-
const sampleRateIndex = (h[2] >> 2) & 0x03;
|
|
125
|
-
return version !== 0x01 && layer === 0x01 && bitrateIndex !== 0x0f && sampleRateIndex !== 0x03;
|
|
126
|
-
}
|
|
127
|
-
/** RIFF 容器:'RIFF' 加 4 字节长度,偏移 8 处是形式类型(WAVE、AVI 、WEBP)。 */
|
|
128
|
-
function isRiff(h, formType) {
|
|
129
|
-
return hasAscii(h, 0, 'RIFF') && hasAscii(h, 8, formType);
|
|
130
|
-
}
|
|
131
|
-
function hasBytes(h, offset, bytes) {
|
|
132
|
-
if (h.length < offset + bytes.length)
|
|
133
|
-
return false;
|
|
134
|
-
return bytes.every((b, i) => h[offset + i] === b);
|
|
135
|
-
}
|
|
136
|
-
function hasAscii(h, offset, text) {
|
|
137
|
-
if (h.length < offset + text.length)
|
|
138
|
-
return false;
|
|
139
|
-
for (let i = 0; i < text.length; i++) {
|
|
140
|
-
if (h[offset + i] !== text.charCodeAt(i))
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
return true;
|
|
144
|
-
}
|
|
145
|
-
function ascii(h, offset, length) {
|
|
146
|
-
return String.fromCharCode(...h.subarray(offset, offset + length));
|
|
147
|
-
}
|
|
148
|
-
function readUint32BE(h, offset) {
|
|
149
|
-
return ((h[offset] << 24) | (h[offset + 1] << 16) | (h[offset + 2] << 8) | h[offset + 3]) >>> 0;
|
|
150
|
-
}
|
|
151
|
-
function readUint32LE(h, offset) {
|
|
152
|
-
return (h[offset] | (h[offset + 1] << 8) | (h[offset + 2] << 16) | (h[offset + 3] << 24)) >>> 0;
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=media-signature.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media-signature.js","sourceRoot":"","sources":["../src/media-signature.ts"],"names":[],"mappings":"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"}
|