@aalis/api-media 0.12.0 → 0.13.1
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 +5 -0
- package/dist/index.d.ts +29 -28
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/scope.d.ts +78 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +143 -0
- package/dist/scope.js.map +1 -0
- package/dist/session-media.d.ts +21 -0
- package/dist/session-media.d.ts.map +1 -0
- package/dist/session-media.js +73 -0
- package/dist/session-media.js.map +1 -0
- package/package.json +9 -5
package/README.md
CHANGED
|
@@ -18,6 +18,11 @@ import { media } from '@aalis/api-media';
|
|
|
18
18
|
|
|
19
19
|
实现见 `@aalis/plugin-media`。
|
|
20
20
|
|
|
21
|
+
另导出两组纯函数(不依赖 `media` 服务在场):
|
|
22
|
+
|
|
23
|
+
- 会话媒体的目录约定:`MEDIA_KIND_DIRS`、`sessionDirName`、`sessionMediaUri`、`clearSessionMedia`。写入方把会话里收发与产生的媒体写进 `data:/<种类目录>/<会话目录>/<写入方>/`,并挂 `memory:clear` 中间件清自己的子目录。
|
|
24
|
+
- 媒体判据:`mediaScopeOf`、`mediaInScope`、`localFileInScope`、`mediaRef`、`historyMediaRefs`。本会话的媒体放行,别的会话的媒体交给调用方给的取用判定,不属于任何会话的本机文件交给本机文件判定。`mediaScopeOf` 按一次调用给出第一方的两样判定(会话管理的取用规则;`localFileInScope`,按这一轮的主体),按路径取存储媒体的工具用它。
|
|
25
|
+
|
|
21
26
|
## 文档
|
|
22
27
|
|
|
23
28
|
详见 [docs/services/media.md](../../docs/services/media.md)。
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ModelRef } from '@aalis/api-llm';
|
|
2
|
+
import type { TextRef } from '@aalis/schema-i18n';
|
|
2
3
|
import type { IncomingMessage, MessageAttachment } from '@aalis/schema-message';
|
|
3
4
|
/** 媒体能力枚举(与 LLM Capability 互不重叠:LLM 描述模型能力,Media 描述处理动作) */
|
|
4
5
|
export type MediaCapability =
|
|
@@ -21,8 +22,8 @@ export interface MediaProcessor {
|
|
|
21
22
|
name: string;
|
|
22
23
|
/** 可处理的能力集 */
|
|
23
24
|
capabilities: MediaCapability[];
|
|
24
|
-
/** 显示名(UI
|
|
25
|
-
displayName?: string;
|
|
25
|
+
/** 显示名(UI 用):可以是文字对象(@aalis/schema-i18n),出口按读者语言渲染 */
|
|
26
|
+
displayName?: string | TextRef;
|
|
26
27
|
/** 优先级(数值大者优先;同 cap 多 processor 时由 MediaService 仲裁;默认 0) */
|
|
27
28
|
priority?: number;
|
|
28
29
|
/** 描述/识别(用于 vision / document.image / video.passthrough) */
|
|
@@ -47,7 +48,7 @@ export interface DescribeInput {
|
|
|
47
48
|
/**
|
|
48
49
|
* 追加约束提示(可选):在 base prompt 与 context 之后追加,
|
|
49
50
|
* 语义是"再加一条要求",例如 "请重点描述左上角"。
|
|
50
|
-
* ⚠️ 不要把另一段完整 prompt
|
|
51
|
+
* ⚠️ 不要把另一段完整 prompt 放入 hint,会与 base 冲突;那种场景请用 basePrompt。
|
|
51
52
|
*/
|
|
52
53
|
hint?: string;
|
|
53
54
|
/**
|
|
@@ -91,6 +92,8 @@ export interface TranscribeInput {
|
|
|
91
92
|
context?: string;
|
|
92
93
|
/** 音频所在的会话:转写的模型调用按它记账(api-llm 的 ChatModelRequest.sessionId);不在会话里转写时不填 */
|
|
93
94
|
sessionId?: string;
|
|
95
|
+
/** 中止信号:交给转写前的转码与转写(模型调用或 asr 的转写),中止时转写随之停下 */
|
|
96
|
+
signal?: AbortSignal;
|
|
94
97
|
}
|
|
95
98
|
export interface TranscribeResult {
|
|
96
99
|
/** 完整文本 */
|
|
@@ -110,15 +113,13 @@ export interface TranscribeResult {
|
|
|
110
113
|
}
|
|
111
114
|
/** plugin-media 暴露的服务(subsystem='media') */
|
|
112
115
|
export interface MediaService {
|
|
113
|
-
/**
|
|
116
|
+
/** 注册非音频、非 LLM 的 backend(LLM 走内置 adapter 自动注册,音频后端走 asr 服务,都无需手动调用) */
|
|
114
117
|
registerProcessor(p: MediaProcessor): () => void;
|
|
115
118
|
/** 列出当前可用 processor */
|
|
116
119
|
listProcessors(cap?: MediaCapability): MediaProcessor[];
|
|
117
|
-
/** 选 processor:优先 prefer(可是 processor name 字符串或 LLM ModelRef),再按 priority;找不到返回 null */
|
|
118
|
-
pickProcessor(cap: MediaCapability, prefer?: string | ModelRef | null): MediaProcessor | null;
|
|
119
120
|
/** 描述:根据每个 attachment 的 kind/mime 自动选 processor */
|
|
120
121
|
describe(attachments: MessageAttachment[], opts?: DescribeOptions): Promise<Array<string | undefined>>;
|
|
121
|
-
/**
|
|
122
|
+
/** 转写:单条音频。转不出时为 undefined;调用方中止、提供方停用或停机时抛中止原因 */
|
|
122
123
|
transcribe(attachment: MessageAttachment, opts?: TranscribeOptions): Promise<string | undefined>;
|
|
123
124
|
/**
|
|
124
125
|
* 一站式:处理整条 IncomingMessage 的所有 attachments,
|
|
@@ -129,11 +130,11 @@ export interface MediaService {
|
|
|
129
130
|
*/
|
|
130
131
|
processMessage(msg: IncomingMessage): Promise<MediaProcessReport>;
|
|
131
132
|
/**
|
|
132
|
-
*
|
|
133
|
-
*
|
|
133
|
+
* 主动描述单张图片(含动图自动多帧,抽不出帧的按整图识别)。没有可用的 vision processor 或识别结果为空时返回空串;
|
|
134
|
+
* 识别过程出错(识别模型调用失败、图取不到等)时抛出,调用方需自行 try/catch。
|
|
134
135
|
* 与 describe([att]) 不同:本方法专为 `analyze_image` 等单图工具优化,
|
|
135
|
-
* 内部走描述缓存(30 天滑动 TTL
|
|
136
|
-
*
|
|
136
|
+
* 内部走描述缓存(30 天滑动 TTL;文件名按内容寻址的存储地址取文件名里的内容哈希做键,见 session-media 的命名
|
|
137
|
+
* 约定,网址与 data URI 经落盘时登记的别名收敛到落盘地址的键上);可传 hint 注入用户意图(带 hint 不读写缓存)。
|
|
137
138
|
*/
|
|
138
139
|
describeImage(imageUrl: string, opts?: DescribeImageOptions): Promise<string>;
|
|
139
140
|
/**
|
|
@@ -141,23 +142,19 @@ export interface MediaService {
|
|
|
141
142
|
* 与 `describe([videoAttachment])` 等价但更适合按 URL 直接调用的工具/适配器场景。
|
|
142
143
|
*/
|
|
143
144
|
describeVideo(videoUrl: string, opts?: DescribeVideoOptions): Promise<string>;
|
|
144
|
-
/**
|
|
145
|
+
/**
|
|
146
|
+
* 查描述缓存(不触发识别)。未命中返回 null。传原始来源(网址、data URI、存储地址);落盘方登记过别名的来源按
|
|
147
|
+
* 原始来源同样命中落盘后的描述。带会话语境识别的描述只在本会话命中(键是落盘的存储地址),这里查不到
|
|
148
|
+
*/
|
|
145
149
|
lookupDescription(imageUrl: string): string | null;
|
|
146
|
-
/** 写入描述缓存(一般由 describeImage 自动调用,外部很少用)。 */
|
|
147
|
-
rememberDescription(imageUrl: string, description: string): void;
|
|
148
150
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
151
|
+
* 登记「原始来源(网址、data URI)→ 落盘的存储地址」别名:由**落盘方**在落盘成功后调一次
|
|
152
|
+
* (适配器把远端网址落成 `data:/images/…` 时、WebUI 的 base64 落盘时)。
|
|
153
|
+
* 此后按**原始来源**查描述(lookupDescription)、识别后写描述都落到落盘地址的那条描述上——
|
|
154
|
+
* OneBot 引用消息只拿得到原始网址时也不必重认。别名按来源串相等命中;
|
|
153
155
|
* QQ 直链的 rkey 会轮换,由适配器在登记与查询两侧剥掉后再登记/再查一次(见 plugin-adapter-onebot)。
|
|
154
156
|
*/
|
|
155
157
|
rememberDescriptionAlias(source: string, landedRef: string): void;
|
|
156
|
-
/**
|
|
157
|
-
* 为含图消息构造视觉识别上下文(当前消息 + 引用消息 + 最近历史)。
|
|
158
|
-
* 用作 vision LLM 的 hint,让模型聚焦用户真正关心的问题。
|
|
159
|
-
*/
|
|
160
|
-
buildContext(msg: IncomingMessage, opts?: BuildContextOptions): Promise<string>;
|
|
161
158
|
}
|
|
162
159
|
export interface DescribeImageOptions {
|
|
163
160
|
/** 用户意图 / 上下文(如 "找出图中的猫") */
|
|
@@ -180,7 +177,7 @@ export interface DescribeImageOptions {
|
|
|
180
177
|
detailLevel?: 'auto' | 'casual' | 'detailed' | 'professional';
|
|
181
178
|
/** 图片所在的会话:识别的模型调用按它记账(同 {@link DescribeInput.sessionId});不在会话里识别时不填 */
|
|
182
179
|
sessionId?: string;
|
|
183
|
-
/**
|
|
180
|
+
/** 中止信号:网址来源的下载随之停下,并经 {@link DescribeInput.signal} 交给识别的模型调用(如 analyze_image 传执行器给这次调用的信号) */
|
|
184
181
|
signal?: AbortSignal;
|
|
185
182
|
}
|
|
186
183
|
export interface DescribeVideoOptions {
|
|
@@ -188,19 +185,21 @@ export interface DescribeVideoOptions {
|
|
|
188
185
|
hint?: string;
|
|
189
186
|
/** 本地缓存路径(避免重新下载) */
|
|
190
187
|
localPath?: string;
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
/** 最近前文条数,默认由实现决定 */
|
|
194
|
-
beforeLimit?: number;
|
|
188
|
+
/** 中止信号:调用方不再要结果时(停用、回合中止等)下载、抽帧、转写与识别随之停下 */
|
|
189
|
+
signal?: AbortSignal;
|
|
195
190
|
}
|
|
196
191
|
export interface DescribeOptions {
|
|
197
192
|
hint?: string;
|
|
198
193
|
maxTokens?: number;
|
|
199
194
|
/** 强制使用某个 processor(processor name 或 LLM ModelRef) */
|
|
200
195
|
prefer?: string | ModelRef;
|
|
196
|
+
/** 中止信号:调用方不再要结果时识别随之停下 */
|
|
197
|
+
signal?: AbortSignal;
|
|
201
198
|
}
|
|
202
199
|
export interface TranscribeOptions {
|
|
203
200
|
language?: string;
|
|
201
|
+
/** 中止信号:调用方不再要结果时下载、转码与转写随之停下 */
|
|
202
|
+
signal?: AbortSignal;
|
|
204
203
|
}
|
|
205
204
|
export interface MediaProcessReport {
|
|
206
205
|
total: number;
|
|
@@ -227,4 +226,6 @@ declare module '@aalis/core' {
|
|
|
227
226
|
}
|
|
228
227
|
}
|
|
229
228
|
export declare const media: import("@aalis/core").ServiceDescriptor<MediaService, MediaService>;
|
|
229
|
+
export * from './scope.js';
|
|
230
|
+
export * from './session-media.js';
|
|
230
231
|
//# 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":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,11 +4,17 @@
|
|
|
4
4
|
// Aalis 把"媒体 → 文本"的处理路径抽象为 MediaProcessor。
|
|
5
5
|
// plugin-media 既是该契约的调度器,也是 LLM 服务的内置 adapter
|
|
6
6
|
// (任意声明了 vision / audio 能力的 LLM 都自动暴露为对应 processor)。
|
|
7
|
-
//
|
|
7
|
+
// 音频后端(如 whisper.cpp / 云 ASR)走 asr 服务(@aalis/api-asr),由 plugin-media 包成音频 processor;
|
|
8
|
+
// registerProcessor 只用于非音频、非 LLM 的 backend。
|
|
9
|
+
// 另导出会话媒体的目录约定(session-media.ts:写入方写在哪、怎么清)与媒体判据(scope.ts:一次调用能取哪些存储里的
|
|
10
|
+
// 媒体,发媒体、看图的工具与回复里的媒体标记共用)。
|
|
8
11
|
//
|
|
9
|
-
// 依赖:@aalis/core、@aalis/schema-message、@aalis/api-llm(仅 ModelRef
|
|
12
|
+
// 依赖:@aalis/core、@aalis/schema-message、@aalis/api-llm(仅 ModelRef 类型)、
|
|
13
|
+
// @aalis/api-authority(仅入站回合与权限服务的类型)、@aalis/api-session-manager 与 @aalis/api-storage(目录约定与判据用的纯函数)。
|
|
10
14
|
// ============================================================
|
|
11
15
|
import { defineService } from '@aalis/core';
|
|
12
16
|
// ----- 服务描述符(调用型:业务层就是提供者的形状)-----
|
|
13
17
|
export const media = defineService('media');
|
|
18
|
+
export * from './scope.js';
|
|
19
|
+
export * from './session-media.js';
|
|
14
20
|
//# 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":"AAAA,+DAA+D;AAC/D,+BAA+B;AAC/B,EAAE;AACF,2CAA2C;AAC3C,8CAA8C;AAC9C,qDAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+BAA+B;AAC/B,EAAE;AACF,2CAA2C;AAC3C,8CAA8C;AAC9C,qDAAqD;AACrD,qFAAqF;AACrF,4CAA4C;AAC5C,uEAAuE;AACvE,4BAA4B;AAC5B,EAAE;AACF,sEAAsE;AACtE,qGAAqG;AACrG,+DAA+D;AAG/D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA+O5C,oCAAoC;AACpC,MAAM,CAAC,MAAM,KAAK,GAAG,aAAa,CAAe,OAAO,CAAC,CAAC;AAE1D,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
|
package/dist/scope.d.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { AuthorityService, InboundTurn, UserIdentity, Verdict } from '@aalis/api-authority';
|
|
2
|
+
import { type SessionManagerService } from '@aalis/api-session-manager';
|
|
3
|
+
import type { ServiceSelection } from '@aalis/core';
|
|
4
|
+
import { type Message } from '@aalis/schema-message';
|
|
5
|
+
/**
|
|
6
|
+
* 一次调用:所在的会话、平台、这一轮的参与者(授权身份)与入站回合,字段同工具调用上下文;没有授权身份的参与者为空。本机文件
|
|
7
|
+
* 判法拿它取这一轮的主体
|
|
8
|
+
*/
|
|
9
|
+
export interface MediaScopeCall {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
platform?: string;
|
|
12
|
+
participants: readonly UserIdentity[];
|
|
13
|
+
inbound?: InboundTurn;
|
|
14
|
+
}
|
|
15
|
+
/** 判据要的几样,由调用方按这一次调用给 */
|
|
16
|
+
export interface MediaScopeDeps {
|
|
17
|
+
/** 会话表:会话管理在场才给,判会话树与按目录名反查会话;不给时只认调用所在会话,别的会话的媒体一律不能取 */
|
|
18
|
+
sessions?: Pick<SessionManagerService, 'getSession' | 'listSessions'>;
|
|
19
|
+
/** 别的会话的媒体:目录名反查出的、本会话树以外的这几个会话(至少一个)都能不能取,第一方见 {@link mediaScopeOf} */
|
|
20
|
+
take: (sessionIds: readonly string[]) => Promise<boolean>;
|
|
21
|
+
/** 不在任何会话媒体目录下的本机文件能不能取,第一方见 {@link mediaScopeOf} */
|
|
22
|
+
local: () => Promise<boolean>;
|
|
23
|
+
/** 某会话最近的历史(第一方取 200 条):记忆不在时为空 */
|
|
24
|
+
history: (sessionId: string) => Promise<readonly Message[]>;
|
|
25
|
+
}
|
|
26
|
+
/** 本机文件判法要的几样 */
|
|
27
|
+
export interface LocalFileDeps {
|
|
28
|
+
/** 这一轮的主体(api-authority 的 principalOf):权限服务不在时恒为 other */
|
|
29
|
+
principalOf: (call: MediaScopeCall) => 'owner' | 'other';
|
|
30
|
+
/** owner 判定:权限服务不在时恒为否 */
|
|
31
|
+
isOwner: (platform: string, userId: string) => boolean;
|
|
32
|
+
/** 会话表:会话管理在场才给;不给时判不出受众,非人回合的条款不放行 */
|
|
33
|
+
sessions?: Pick<SessionManagerService, 'getSession'>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 媒体地址规整成可比的形态:网址(api-storage 的 isWebUrl:http、https,协议名不分大小写)原样;存储地址规整(消 `.`、
|
|
37
|
+
* `..`);其余不是网址也不是存储地址的(相对路径、本机路径含盘符路径、`file://`、data URI,以及带反斜杠的:有的系统按
|
|
38
|
+
* 目录分隔解析它)没有。`base64://…` 按根名 base64 的存储地址交出,算本机文件,没有这个根,读不出
|
|
39
|
+
*/
|
|
40
|
+
export declare function mediaRef(input: string): string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* 历史里系统记下的媒体引用(经 {@link mediaRef} 规整):入站附件清单(metadata 的 Attachments 各项的 ref)与发出的附件
|
|
43
|
+
* (SentRef)。不读正文里的占位符:群友能打出伪造的
|
|
44
|
+
*/
|
|
45
|
+
export declare function historyMediaRefs(messages: readonly Message[]): string[];
|
|
46
|
+
/**
|
|
47
|
+
* 这次调用能不能取 target(存储地址,判据先按 {@link mediaRef} 规整,调用方读规整后的那个),按目标分三类。会话媒体目录
|
|
48
|
+
* (`data:/{images,audios,videos,files}/<目录>/`、`tmp:/browser/<目录>/`)里的按目录名在本会话树(根会话加它的全部子会话)与
|
|
49
|
+
* 会话表里反查会话(按大小写折叠比,几个会话撞同一个目录时取并集):
|
|
50
|
+
* 1. 反查出的会话都在本会话树里,或等于调用所在会话历史里系统记下的引用({@link historyMediaRefs}):放行。先比目录,不中再读历史;
|
|
51
|
+
* 2. 反查出本会话树以外的会话(与本会话树撞名的也算):take 判这些会话都能取才放行,本会话树的不问;一个会话都反查不到时不能;
|
|
52
|
+
* 3. 不在任何会话媒体目录下的:按 local,调用所在会话历史里记过的也一样:本机文件按地址取到的是此刻的内容,不一定是当初
|
|
53
|
+
* 收发的那份。
|
|
54
|
+
*
|
|
55
|
+
* 媒体目录按整棵会话树(子任务里能用发起它的群里的图),历史只取调用所在会话
|
|
56
|
+
*/
|
|
57
|
+
export declare function mediaInScope(target: string, call: Pick<MediaScopeCall, 'sessionId'>, deps: MediaScopeDeps): Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
* 第一方的判据:交出这次调用判 target 的函数({@link mediaInScope})。两样判定都交给调用方给的取用判定 approveFor(同工具调用
|
|
60
|
+
* 上下文的),check 按一个授权身份判:别的会话的媒体每个候选都过会话管理的取用规则(takeFrom,当前会话是调用所在会话),本机
|
|
61
|
+
* 文件按只有这一位参与者时的 {@link localFileInScope}(主体取权限服务的 principalOf)。工具交它的工具调用上下文,逐个参与者判、
|
|
62
|
+
* 有人过不了时发一道参与者审批;没有可挂审批的调用的(回复里的标记)交只按一个授权身份判的。权限服务不在时主体是 other、没人
|
|
63
|
+
* 是 owner
|
|
64
|
+
*/
|
|
65
|
+
export declare function mediaScopeOf(call: MediaScopeCall & {
|
|
66
|
+
approveFor(check: (who: UserIdentity) => Verdict): Promise<Verdict>;
|
|
67
|
+
}, services: {
|
|
68
|
+
sessionManager: Pick<ServiceSelection<SessionManagerService>, 'present' | 'use'>;
|
|
69
|
+
authority: Pick<ServiceSelection<AuthorityService>, 'present' | 'use'>;
|
|
70
|
+
history: MediaScopeDeps['history'];
|
|
71
|
+
}): (target: string) => Promise<boolean>;
|
|
72
|
+
/**
|
|
73
|
+
* 不属于任何会话的本机文件(存储里不在会话媒体目录下的文件)这次调用能不能取:这一轮的主体是 owner(owner 亲手那一轮,
|
|
74
|
+
* 参与者都是 owner,含它的续做与它派的子任务);或只有一位参与者、他是 owner、所在会话的房间类别不是 room(非人回合的条款,
|
|
75
|
+
* 如 owner 自己会话里的定时任务、按 owner 跑的编排、mcp-server 的调用)
|
|
76
|
+
*/
|
|
77
|
+
export declare function localFileInScope(call: MediaScopeCall, deps: LocalFileDeps): boolean;
|
|
78
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAA4B,KAAK,qBAAqB,EAAY,MAAM,4BAA4B,CAAC;AAE5G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAA2B,KAAK,OAAO,EAAyB,MAAM,uBAAuB,CAAC;AAGrG;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,SAAS,YAAY,EAAE,CAAC;IACtC,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,yBAAyB;AACzB,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,cAAc,CAAC,CAAC;IACtE,wEAAwE;IACxE,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,qDAAqD;IACrD,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,mCAAmC;IACnC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;CAC7D;AAED,iBAAiB;AACjB,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,WAAW,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC;IACzD,0BAA0B;IAC1B,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACvD,uCAAuC;IACvC,QAAQ,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;CACtD;AAWD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,EAAE,CAcvE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,EACvC,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,cAAc,GAAG;IAAE,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,EAC9F,QAAQ,EAAE;IACR,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;IACjF,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;IACvE,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;CACpC,GACA,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAsBtC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAOnF"}
|
package/dist/scope.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// scope.ts — 媒体判据:一次调用能取哪些存储里的媒体
|
|
3
|
+
//
|
|
4
|
+
// 按目标分三类:会话媒体目录里的按目录名反查会话,本会话树的与调用所在会话历史里系统记下的放行,别的会话(含与本会话树
|
|
5
|
+
// 撞名的)交给调用方给的取用判定;不在任何会话媒体目录下的本机文件交给调用方给的本机文件判定,历史里记过的也一样。第一方的
|
|
6
|
+
// 两样判定由 mediaScopeOf 按一次调用给(会话管理的取用规则,经 api-session-manager 的 takeFrom;本机文件判法
|
|
7
|
+
// localFileInScope),发媒体、看图的工具与回复里的媒体标记都用它,经调用方给的取用判定判:工具交工具调用上下文的
|
|
8
|
+
// approveFor,逐个参与者判。
|
|
9
|
+
//
|
|
10
|
+
// 判据按写入方的目录约定判归属,不是隔离:同一个根里的符号链接,或能往本会话目录写文件的工具,都能把别处的媒体伪装成
|
|
11
|
+
// 本会话的。会话目录名取自 session-media 的 sessionDirName,换法有损(见它的说明):种类目录与反查会话的目录名按大小写折叠比
|
|
12
|
+
// (大小写不敏感的卷上读到的是同一个目录),几个会话落进同一个目录时,本会话树以外的每个都要过取用判定,与本会话树撞名也一样。
|
|
13
|
+
// ============================================================
|
|
14
|
+
import { roomClass, rootSessionOf, takeFrom } from '@aalis/api-session-manager';
|
|
15
|
+
import { isHostAbsolutePath, isStorageUri, isWebUrl, parseStorageUri } from '@aalis/api-storage';
|
|
16
|
+
import { WellKnownMetadataKeys } from '@aalis/schema-message';
|
|
17
|
+
import { MEDIA_KIND_DIRS, sessionDirName } from './session-media.js';
|
|
18
|
+
/** 本机文件判法不放行时交给取用判定的:判据只回能或不能(工具过不了的一律回同一句,先判后读),这里的原因没有读者 */
|
|
19
|
+
const NOT_LOCAL = { ok: false, reason: '' };
|
|
20
|
+
/** 会话媒体的目录,会话目录在它们下面:各种类的目录({@link MEDIA_KIND_DIRS})与浏览器截图的 `tmp:/browser` */
|
|
21
|
+
const SESSION_MEDIA_DIRS = new Set([...Object.values(MEDIA_KIND_DIRS), 'tmp:/browser']);
|
|
22
|
+
/** 目录名的大小写折叠:只差大小写、或折叠后相同(如 `ſ` 与 `s`)的写法在大小写不敏感的卷上是同一个目录 */
|
|
23
|
+
const fold = (name) => name.toUpperCase().toLowerCase();
|
|
24
|
+
/**
|
|
25
|
+
* 媒体地址规整成可比的形态:网址(api-storage 的 isWebUrl:http、https,协议名不分大小写)原样;存储地址规整(消 `.`、
|
|
26
|
+
* `..`);其余不是网址也不是存储地址的(相对路径、本机路径含盘符路径、`file://`、data URI,以及带反斜杠的:有的系统按
|
|
27
|
+
* 目录分隔解析它)没有。`base64://…` 按根名 base64 的存储地址交出,算本机文件,没有这个根,读不出
|
|
28
|
+
*/
|
|
29
|
+
export function mediaRef(input) {
|
|
30
|
+
const s = input.trim();
|
|
31
|
+
if (isWebUrl(s))
|
|
32
|
+
return s;
|
|
33
|
+
if (s.includes('\\') || isHostAbsolutePath(s) || !isStorageUri(s))
|
|
34
|
+
return undefined;
|
|
35
|
+
const { root, segments } = parseStorageUri(s);
|
|
36
|
+
return `${root}:/${segments.join('/')}`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 历史里系统记下的媒体引用(经 {@link mediaRef} 规整):入站附件清单(metadata 的 Attachments 各项的 ref)与发出的附件
|
|
40
|
+
* (SentRef)。不读正文里的占位符:群友能打出伪造的
|
|
41
|
+
*/
|
|
42
|
+
export function historyMediaRefs(messages) {
|
|
43
|
+
const refs = [];
|
|
44
|
+
for (const { metadata } of messages) {
|
|
45
|
+
const attachments = metadata?.[WellKnownMetadataKeys.Attachments];
|
|
46
|
+
const raws = [
|
|
47
|
+
...(Array.isArray(attachments) ? attachments.map(a => a?.ref) : []),
|
|
48
|
+
metadata?.[WellKnownMetadataKeys.SentRef],
|
|
49
|
+
];
|
|
50
|
+
for (const raw of raws) {
|
|
51
|
+
const ref = typeof raw === 'string' ? mediaRef(raw) : undefined;
|
|
52
|
+
if (ref)
|
|
53
|
+
refs.push(ref);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return refs;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 这次调用能不能取 target(存储地址,判据先按 {@link mediaRef} 规整,调用方读规整后的那个),按目标分三类。会话媒体目录
|
|
60
|
+
* (`data:/{images,audios,videos,files}/<目录>/`、`tmp:/browser/<目录>/`)里的按目录名在本会话树(根会话加它的全部子会话)与
|
|
61
|
+
* 会话表里反查会话(按大小写折叠比,几个会话撞同一个目录时取并集):
|
|
62
|
+
* 1. 反查出的会话都在本会话树里,或等于调用所在会话历史里系统记下的引用({@link historyMediaRefs}):放行。先比目录,不中再读历史;
|
|
63
|
+
* 2. 反查出本会话树以外的会话(与本会话树撞名的也算):take 判这些会话都能取才放行,本会话树的不问;一个会话都反查不到时不能;
|
|
64
|
+
* 3. 不在任何会话媒体目录下的:按 local,调用所在会话历史里记过的也一样:本机文件按地址取到的是此刻的内容,不一定是当初
|
|
65
|
+
* 收发的那份。
|
|
66
|
+
*
|
|
67
|
+
* 媒体目录按整棵会话树(子任务里能用发起它的群里的图),历史只取调用所在会话
|
|
68
|
+
*/
|
|
69
|
+
export async function mediaInScope(target, call, deps) {
|
|
70
|
+
const uri = mediaRef(target);
|
|
71
|
+
if (!uri || !isStorageUri(uri))
|
|
72
|
+
return false;
|
|
73
|
+
const { sessions } = deps;
|
|
74
|
+
const { root, segments } = parseStorageUri(uri);
|
|
75
|
+
const dir = segments.length >= 3 && SESSION_MEDIA_DIRS.has(`${root}:/${fold(segments[0])}`) ? fold(segments[1]) : undefined;
|
|
76
|
+
const tree = sessionTree(call.sessionId, sessions);
|
|
77
|
+
const named = (id) => fold(sessionDirName(id)) === dir;
|
|
78
|
+
const mine = dir !== undefined && [...tree].some(named);
|
|
79
|
+
const others = dir === undefined
|
|
80
|
+
? []
|
|
81
|
+
: (sessions?.listSessions() ?? []).map(({ id }) => id).filter(id => !tree.has(id) && named(id));
|
|
82
|
+
if (mine && others.length === 0)
|
|
83
|
+
return true;
|
|
84
|
+
if (dir === undefined)
|
|
85
|
+
return deps.local();
|
|
86
|
+
if (historyMediaRefs(await deps.history(call.sessionId)).includes(uri))
|
|
87
|
+
return true;
|
|
88
|
+
return others.length > 0 && deps.take(others);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 第一方的判据:交出这次调用判 target 的函数({@link mediaInScope})。两样判定都交给调用方给的取用判定 approveFor(同工具调用
|
|
92
|
+
* 上下文的),check 按一个授权身份判:别的会话的媒体每个候选都过会话管理的取用规则(takeFrom,当前会话是调用所在会话),本机
|
|
93
|
+
* 文件按只有这一位参与者时的 {@link localFileInScope}(主体取权限服务的 principalOf)。工具交它的工具调用上下文,逐个参与者判、
|
|
94
|
+
* 有人过不了时发一道参与者审批;没有可挂审批的调用的(回复里的标记)交只按一个授权身份判的。权限服务不在时主体是 other、没人
|
|
95
|
+
* 是 owner
|
|
96
|
+
*/
|
|
97
|
+
export function mediaScopeOf(call, services) {
|
|
98
|
+
const { sessionManager, authority, history } = services;
|
|
99
|
+
const sessions = sessionManager.present ? sessionManager.use : undefined;
|
|
100
|
+
const localDeps = {
|
|
101
|
+
principalOf: turn => authority.present ? authority.use.principalOf({ ...turn, platform: turn.platform ?? '' }) : 'other',
|
|
102
|
+
isOwner: (platform, userId) => authority.present && authority.use.isOwner(platform, userId),
|
|
103
|
+
sessions,
|
|
104
|
+
};
|
|
105
|
+
const judge = async (check) => (await call.approveFor(check)).ok;
|
|
106
|
+
const deps = {
|
|
107
|
+
sessions,
|
|
108
|
+
take: ids => judge(who => ids.map(id => takeFrom(sessionManager, call.sessionId, id, who)).find(verdict => !verdict.ok) ?? { ok: true }),
|
|
109
|
+
local: () => judge(who => (localFileInScope({ ...call, participants: [who] }, localDeps) ? { ok: true } : NOT_LOCAL)),
|
|
110
|
+
history,
|
|
111
|
+
};
|
|
112
|
+
return target => mediaInScope(target, call, deps);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 不属于任何会话的本机文件(存储里不在会话媒体目录下的文件)这次调用能不能取:这一轮的主体是 owner(owner 亲手那一轮,
|
|
116
|
+
* 参与者都是 owner,含它的续做与它派的子任务);或只有一位参与者、他是 owner、所在会话的房间类别不是 room(非人回合的条款,
|
|
117
|
+
* 如 owner 自己会话里的定时任务、按 owner 跑的编排、mcp-server 的调用)
|
|
118
|
+
*/
|
|
119
|
+
export function localFileInScope(call, deps) {
|
|
120
|
+
if (deps.principalOf(call) === 'owner')
|
|
121
|
+
return true;
|
|
122
|
+
const { sessions, isOwner } = deps;
|
|
123
|
+
const [only, ...more] = call.participants;
|
|
124
|
+
if (!sessions || !only?.userId || more.length > 0 || !isOwner(only.platform, only.userId))
|
|
125
|
+
return false;
|
|
126
|
+
const lookup = (id) => sessions.getSession(id);
|
|
127
|
+
return roomClass(lookup(call.sessionId), lookup, isOwner) !== 'room';
|
|
128
|
+
}
|
|
129
|
+
/** 会话树的全部会话 id:根会话与它的全部子会话,连同调用所在的会话;会话管理不在时只有它自己 */
|
|
130
|
+
function sessionTree(sessionId, sessions) {
|
|
131
|
+
const tree = new Set();
|
|
132
|
+
const lookup = (id) => sessions?.getSession(id);
|
|
133
|
+
const root = rootSessionOf(lookup(sessionId), lookup);
|
|
134
|
+
const pending = root ? [root.id] : [];
|
|
135
|
+
for (let id = pending.pop(); id !== undefined; id = pending.pop()) {
|
|
136
|
+
if (tree.has(id))
|
|
137
|
+
continue;
|
|
138
|
+
tree.add(id);
|
|
139
|
+
pending.push(...(lookup(id)?.children ?? []));
|
|
140
|
+
}
|
|
141
|
+
return tree.add(sessionId);
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type StorageService } from '@aalis/api-storage';
|
|
2
|
+
import type { MessageAttachment } from '@aalis/schema-message';
|
|
3
|
+
type MediaKind = MessageAttachment['kind'];
|
|
4
|
+
type Storage = Pick<StorageService, 'list' | 'delete'>;
|
|
5
|
+
/** 各种会话媒体的目录:下面一级是会话目录,再下面是写入方的子目录 */
|
|
6
|
+
export declare const MEDIA_KIND_DIRS: Readonly<Record<MediaKind, string>>;
|
|
7
|
+
/**
|
|
8
|
+
* 会话 id → 会话目录名:`:`、`/`、`\`、`..` 与前导点换成 `_`。换法有损:会话 id 不能只在这几处有区别(`x:a_b` 与
|
|
9
|
+
* `x:a:b` 落进同一个目录),大小写不敏感的卷上只差大小写的也落进同一个目录。空 id 抛错:工具调用上下文的 sessionId
|
|
10
|
+
* 必填,空的是调用方的缺陷
|
|
11
|
+
*/
|
|
12
|
+
export declare function sessionDirName(sessionId: string): string;
|
|
13
|
+
/** 写入方在这个会话里这种媒体的目录:`data:/<种类目录>/<会话目录>/<写入方>` */
|
|
14
|
+
export declare function sessionMediaUri(kind: MediaKind, sessionId: string, writer: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* 删掉写入方在这种媒体里的子目录,会话目录删空了一并删掉;给会话时只删这个会话的,不给时删各会话的。回删掉的文件数,要删的
|
|
17
|
+
* 不在时回 0;其余存储错误照抛
|
|
18
|
+
*/
|
|
19
|
+
export declare function clearSessionMedia(storage: Storage, kind: MediaKind, writer: string, sessionId?: string): Promise<number>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=session-media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-media.d.ts","sourceRoot":"","sources":["../src/session-media.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,KAAK,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC3C,KAAK,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;AAEvD,sCAAsC;AACtC,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAK/D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1F;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAQjB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// session-media.ts — 会话媒体的目录约定:会话里收发与产生的媒体写在哪、谁来清
|
|
3
|
+
//
|
|
4
|
+
// 布局 `data:/<种类目录>/<会话目录>/<写入方>/<文件>`:种类目录见 MEDIA_KIND_DIRS,会话目录由 sessionDirName 从会话 id
|
|
5
|
+
// 换来,写入方(onebot、media、draw,第三方用自己的名字)各写自己的子目录,引用一律写完整的存储地址。谁写的谁清:写入方
|
|
6
|
+
// 挂 memory:clear 中间件,按所选类型调 clearSessionMedia 清自己的子目录,/clear 与删会话都走这一条。
|
|
7
|
+
//
|
|
8
|
+
// 命名约定:按内容寻址的写入方把文件名写成内容 SHA-256 的前 16 位小写十六进制加扩展名(onebot、media 是这样),媒体识别
|
|
9
|
+
// 的描述缓存据此让不带会话语境的描述跨会话复用;文件名不是这种写法的(如绘图产物)按存储地址各存一条。
|
|
10
|
+
// ============================================================
|
|
11
|
+
import { isStorageNotFound } from '@aalis/api-storage';
|
|
12
|
+
/** 各种会话媒体的目录:下面一级是会话目录,再下面是写入方的子目录 */
|
|
13
|
+
export const MEDIA_KIND_DIRS = {
|
|
14
|
+
image: 'data:/images',
|
|
15
|
+
audio: 'data:/audios',
|
|
16
|
+
video: 'data:/videos',
|
|
17
|
+
file: 'data:/files',
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* 会话 id → 会话目录名:`:`、`/`、`\`、`..` 与前导点换成 `_`。换法有损:会话 id 不能只在这几处有区别(`x:a_b` 与
|
|
21
|
+
* `x:a:b` 落进同一个目录),大小写不敏感的卷上只差大小写的也落进同一个目录。空 id 抛错:工具调用上下文的 sessionId
|
|
22
|
+
* 必填,空的是调用方的缺陷
|
|
23
|
+
*/
|
|
24
|
+
export function sessionDirName(sessionId) {
|
|
25
|
+
if (!sessionId)
|
|
26
|
+
throw new Error('会话 id 为空,取不出会话目录');
|
|
27
|
+
return sessionId
|
|
28
|
+
.replace(/[:/\\]/g, '_')
|
|
29
|
+
.replace(/\.\./g, '_')
|
|
30
|
+
.replace(/^\.+/, '_');
|
|
31
|
+
}
|
|
32
|
+
/** 写入方在这个会话里这种媒体的目录:`data:/<种类目录>/<会话目录>/<写入方>` */
|
|
33
|
+
export function sessionMediaUri(kind, sessionId, writer) {
|
|
34
|
+
return `${MEDIA_KIND_DIRS[kind]}/${sessionDirName(sessionId)}/${writer}`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 删掉写入方在这种媒体里的子目录,会话目录删空了一并删掉;给会话时只删这个会话的,不给时删各会话的。回删掉的文件数,要删的
|
|
38
|
+
* 不在时回 0;其余存储错误照抛
|
|
39
|
+
*/
|
|
40
|
+
export async function clearSessionMedia(storage, kind, writer, sessionId) {
|
|
41
|
+
const kindDir = MEDIA_KIND_DIRS[kind];
|
|
42
|
+
if (sessionId !== undefined)
|
|
43
|
+
return removeWriterDir(storage, `${kindDir}/${sessionDirName(sessionId)}`, writer);
|
|
44
|
+
let removed = 0;
|
|
45
|
+
for (const { name, isDirectory } of (await listDir(storage, kindDir)) ?? []) {
|
|
46
|
+
if (isDirectory)
|
|
47
|
+
removed += await removeWriterDir(storage, `${kindDir}/${name}`, writer);
|
|
48
|
+
}
|
|
49
|
+
return removed;
|
|
50
|
+
}
|
|
51
|
+
/** 删掉会话目录下写入方的子目录,会话目录删空了一并删掉;回删掉的文件数,子目录不在时回 0 */
|
|
52
|
+
async function removeWriterDir(storage, sessionDir, writer) {
|
|
53
|
+
const dir = `${sessionDir}/${writer}`;
|
|
54
|
+
const files = await listDir(storage, dir);
|
|
55
|
+
if (!files)
|
|
56
|
+
return 0;
|
|
57
|
+
await storage.delete(dir);
|
|
58
|
+
if ((await storage.list(sessionDir)).entries.length === 0)
|
|
59
|
+
await storage.delete(sessionDir);
|
|
60
|
+
return files.length;
|
|
61
|
+
}
|
|
62
|
+
/** 目录里的条目;目录不在时回 undefined */
|
|
63
|
+
async function listDir(storage, uri) {
|
|
64
|
+
try {
|
|
65
|
+
return (await storage.list(uri)).entries;
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (isStorageNotFound(err))
|
|
69
|
+
return undefined;
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=session-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-media.js","sourceRoot":"","sources":["../src/session-media.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kDAAkD;AAClD,EAAE;AACF,wFAAwF;AACxF,qEAAqE;AACrE,wEAAwE;AACxE,EAAE;AACF,0EAA0E;AAC1E,qDAAqD;AACrD,+DAA+D;AAE/D,OAAO,EAAE,iBAAiB,EAAuB,MAAM,oBAAoB,CAAC;AAM5E,sCAAsC;AACtC,MAAM,CAAC,MAAM,eAAe,GAAwC;IAClE,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,aAAa;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACpD,OAAO,SAAS;SACb,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,eAAe,CAAC,IAAe,EAAE,SAAiB,EAAE,MAAc;IAChF,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,MAAM,EAAE,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAgB,EAChB,IAAe,EACf,MAAc,EACd,SAAkB;IAElB,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,OAAO,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAChH,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5E,IAAI,WAAW;YAAE,OAAO,IAAI,MAAM,eAAe,CAAC,OAAO,EAAE,GAAG,OAAO,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mDAAmD;AACnD,KAAK,UAAU,eAAe,CAAC,OAAgB,EAAE,UAAkB,EAAE,MAAc;IACjF,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,MAAM,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5F,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,8BAA8B;AAC9B,KAAK,UAAU,OAAO,CAAC,OAAgB,EAAE,GAAW;IAClD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,iBAAiB,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7C,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aalis/api-media",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -19,16 +19,20 @@
|
|
|
19
19
|
"dist"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@aalis/api-
|
|
23
|
-
"@aalis/
|
|
22
|
+
"@aalis/api-authority": ">=0.12.0 <1.0.0",
|
|
23
|
+
"@aalis/api-llm": ">=0.15.0 <1.0.0",
|
|
24
|
+
"@aalis/api-session-manager": ">=0.12.0 <1.0.0",
|
|
25
|
+
"@aalis/api-storage": ">=0.9.0 <1.0.0",
|
|
26
|
+
"@aalis/schema-message": ">=0.11.0 <1.0.0",
|
|
27
|
+
"@aalis/schema-i18n": ">=0.1.0 <1.0.0"
|
|
24
28
|
},
|
|
25
29
|
"devDependencies": {
|
|
26
30
|
"@types/node": "^22.0.0",
|
|
27
31
|
"typescript": "^5.7.0",
|
|
28
|
-
"@aalis/core": "0.
|
|
32
|
+
"@aalis/core": "0.21.1"
|
|
29
33
|
},
|
|
30
34
|
"peerDependencies": {
|
|
31
|
-
"@aalis/core": ">=0.
|
|
35
|
+
"@aalis/core": ">=0.21.0 <1.0.0"
|
|
32
36
|
},
|
|
33
37
|
"keywords": [
|
|
34
38
|
"aalis",
|