@napuketto/adapter 0.0.2 → 0.0.4

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.
@@ -24,7 +24,7 @@ declare abstract class BaseSatoriAction<TPayload, TReturn> {
24
24
  protected abstract _handle(payload: TPayload): Promise<TReturn>;
25
25
  }
26
26
  //#endregion
27
- //#region src/satori/helper/element.d.ts
27
+ //#region src/satori/helper/element/element.d.ts
28
28
  /** Satori 消息元素(与规范 satori-parse 形状一致;type="text" 为文本节点)。 */
29
29
  interface SatoriElement {
30
30
  type: string;
@@ -40,7 +40,26 @@ declare function parseElements(source: string): SatoriElement[];
40
40
  /** 元素树 → Satori 消息字符串。 */
41
41
  declare function renderElements(elements: SatoriElement[]): string;
42
42
  //#endregion
43
- //#region src/satori/helper/element-convert.d.ts
43
+ //#region src/satori/helper/element/canonical.d.ts
44
+ /** 收方向依赖(at uid 解析)。 */
45
+ interface CanonicalToSatoriDeps {
46
+ /** uid → uin(at 目标显示用;未提供原样返回 uid)。 */
47
+ uidToUin?: (uids: string[]) => Promise<Map<string, string>>;
48
+ }
49
+ /**
50
+ * 收方向:kernel canonical 元素 → Satori 元素树(纯函数映射,宽容忽略 unknown)。
51
+ * at 目标为 uid 时经 uidToUin 转换(异步);无转换器时原样。
52
+ */
53
+ declare function canonicalToSatoriElements(elements: CanonicalElement[], deps?: CanonicalToSatoriDeps): Promise<SatoriElement[]>;
54
+ //#endregion
55
+ //#region src/satori/helper/element/deps.d.ts
56
+ /**
57
+ * 发方向转换依赖契约(Satori 元素 → kernel canonical)
58
+ *
59
+ * 2026-08-08 从 element-convert.ts 独立:media-convert.ts(媒体转换器)同样
60
+ * 消费该类型,独立成文件后消除 element-convert ↔ media-convert 的循环引用
61
+ * (madge 检测的 type-only 环)。
62
+ */
44
63
  /** 发方向依赖(at uin 转换 + 资源下载目录)。 */
45
64
  interface SatoriToCanonicalDeps {
46
65
  /** uin → uid(at 目标转换)。 */
@@ -48,6 +67,8 @@ interface SatoriToCanonicalDeps {
48
67
  /** 资源(img/audio/video/file)下载缓存目录。 */
49
68
  cacheDir: string;
50
69
  }
70
+ //#endregion
71
+ //#region src/satori/helper/element/element-convert.d.ts
51
72
  /** 发方向:Satori 元素树 → kernel canonical(at uin→uid + 资源下载/转码)。 */
52
73
  declare function satoriToCanonicalElements(elements: SatoriElement[], deps: SatoriToCanonicalDeps): Promise<CanonicalElement[]>;
53
74
  /** 解析消息 content 字符串 → canonical(message.create 用)。 */
@@ -142,63 +163,19 @@ declare const satoriConfigSchema: z.ZodObject<{
142
163
  /** Satori 配置类型(由 schema 推导)。 */
143
164
  type SatoriConfig = z.infer<typeof satoriConfigSchema>;
144
165
  //#endregion
145
- //#region src/satori/adapter.d.ts
146
- /** 适配器构造参数。 */
147
- interface SatoriAdapterOptions extends SatoriApiOptions {
148
- /** 协议配置(zod 校验 + seed 装配)。 */
149
- config: ProtocolConfig<SatoriConfig>;
150
- /** network 事件广播(注册传输后 emit 推给第三方)。 */
151
- broadcaster: EventBroadcaster;
152
- /** kernel 消息事件通道(消息收链路入口)。 */
153
- msgChannel: MsgEventChannel;
154
- }
155
- /** Satori 协议适配器。 */
156
- declare class NapukettoSatoriAdapter extends BaseProtocolAdapter<SatoriConfig> {
157
- readonly protocol = "satori";
158
- readonly configSchema: import("zod").ZodObject<{
159
- token: import("zod").ZodOptional<import("zod").ZodString>;
160
- cacheDir: import("zod").ZodOptional<import("zod").ZodString>;
161
- httpServers: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
162
- enabled: import("zod").ZodDefault<import("zod").ZodBoolean>;
163
- host: import("zod").ZodDefault<import("zod").ZodString>;
164
- port: import("zod").ZodDefault<import("zod").ZodNumber>;
165
- token: import("zod").ZodOptional<import("zod").ZodString>;
166
- }, import("zod/v4/core").$strip>>>;
167
- wsServers: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
168
- enabled: import("zod").ZodDefault<import("zod").ZodBoolean>;
169
- host: import("zod").ZodDefault<import("zod").ZodString>;
170
- port: import("zod").ZodDefault<import("zod").ZodNumber>;
171
- token: import("zod").ZodOptional<import("zod").ZodString>;
172
- }, import("zod/v4/core").$strip>>>;
173
- }, import("zod/v4/core").$strip>;
174
- private readonly msgChannel;
175
- private readonly api;
176
- private readonly registry;
177
- private transports;
178
- private unsubscribe;
179
- private eventSn;
180
- constructor(opts: SatoriAdapterOptions);
181
- /** 启动传输:装配(HTTP RPC + WS 事件服务)+ 打开 server + 订阅消息事件。 */
182
- private startTransports;
183
- /** 当前登录信息(READY logins / meta / login.get 用)。 */
184
- private currentLogin;
185
- /** 广播 login-updated 事件(适配器启停时)。 */
186
- private broadcastLoginUpdated;
187
- /** 停止:退订 + 关闭传输 + 广播 login-updated(离线)。 */
188
- private stopAll;
189
- /** 订阅 kernel 消息事件(幂等)。 */
190
- private subscribe;
191
- /** 广播消息事件(message-created)。 */
192
- private broadcastMessageCreated;
193
- /** 广播 grayTip 事件(message-deleted / guild-member-added / removed)。 */
194
- private broadcastGrayTip;
195
- /** 广播事件内容(sn 递增 + 最小 login 包装 + EVENT 信令)。 */
196
- private broadcastContent;
197
- /** 事件 sn(递增,从 1 起)。 */
198
- private nextSn;
199
- /** 退订(幂等)。 */
200
- private unsubscribeAll;
201
- }
166
+ //#region src/satori/helper/error.d.ts
167
+ /** KernelErrorCode → HTTP 状态码映射表。 */
168
+ declare const satoriHttpStatusMap: Record<KernelErrorCode, number>;
169
+ /** HTTP 状态码常量。 */
170
+ declare const HTTP_STATUS: {
171
+ readonly ok: 200;
172
+ readonly badRequest: 400;
173
+ readonly unauthorized: 401;
174
+ readonly forbidden: 403;
175
+ readonly notFound: 404;
176
+ readonly notImplemented: 501;
177
+ readonly serverError: 500;
178
+ };
202
179
  //#endregion
203
180
  //#region src/satori/types/resource.d.ts
204
181
  /**
@@ -304,6 +281,64 @@ interface SatoriTranslateDeps {
304
281
  uidToUin?: (uids: string[]) => Promise<Map<string, string>>;
305
282
  }
306
283
  //#endregion
284
+ //#region src/satori/adapter.d.ts
285
+ /** 适配器构造参数。 */
286
+ interface SatoriAdapterOptions extends SatoriApiOptions {
287
+ /** 协议配置(zod 校验 + seed 装配)。 */
288
+ config: ProtocolConfig<SatoriConfig>;
289
+ /** network 事件广播(注册传输后 emit 推给第三方)。 */
290
+ broadcaster: EventBroadcaster;
291
+ /** kernel 消息事件通道(消息收链路入口)。 */
292
+ msgChannel: MsgEventChannel;
293
+ }
294
+ /** Satori 协议适配器。 */
295
+ declare class NapukettoSatoriAdapter extends BaseProtocolAdapter<SatoriConfig> {
296
+ readonly protocol = "satori";
297
+ readonly configSchema: import("zod").ZodObject<{
298
+ token: import("zod").ZodOptional<import("zod").ZodString>;
299
+ cacheDir: import("zod").ZodOptional<import("zod").ZodString>;
300
+ httpServers: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
301
+ enabled: import("zod").ZodDefault<import("zod").ZodBoolean>;
302
+ host: import("zod").ZodDefault<import("zod").ZodString>;
303
+ port: import("zod").ZodDefault<import("zod").ZodNumber>;
304
+ token: import("zod").ZodOptional<import("zod").ZodString>;
305
+ }, import("zod/v4/core").$strip>>>;
306
+ wsServers: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
307
+ enabled: import("zod").ZodDefault<import("zod").ZodBoolean>;
308
+ host: import("zod").ZodDefault<import("zod").ZodString>;
309
+ port: import("zod").ZodDefault<import("zod").ZodNumber>;
310
+ token: import("zod").ZodOptional<import("zod").ZodString>;
311
+ }, import("zod/v4/core").$strip>>>;
312
+ }, import("zod/v4/core").$strip>;
313
+ private readonly msgChannel;
314
+ private readonly api;
315
+ private readonly registry;
316
+ private transports;
317
+ private unsubscribe;
318
+ private eventSn;
319
+ constructor(opts: SatoriAdapterOptions);
320
+ /** 启动传输:装配(HTTP RPC + WS 事件服务)+ 打开 server + 订阅消息事件。 */
321
+ private startTransports;
322
+ /** 当前登录信息(READY logins / meta / login.get 用)。 */
323
+ private currentLogin;
324
+ /** 广播 login-updated 事件(适配器启停时)。 */
325
+ private broadcastLoginUpdated;
326
+ /** 停止:退订 + 关闭传输 + 广播 login-updated(离线)。 */
327
+ private stopAll;
328
+ /** 订阅 kernel 消息事件(幂等)。 */
329
+ private subscribe;
330
+ /** 广播消息事件(message-created)。 */
331
+ private broadcastMessageCreated;
332
+ /** 广播 grayTip 事件(message-deleted / guild-member-added / removed)。 */
333
+ private broadcastGrayTip;
334
+ /** 广播事件内容(sn 递增 + 最小 login 包装 + EVENT 信令)。 */
335
+ private broadcastContent;
336
+ /** 事件 sn(递增,从 1 起)。 */
337
+ private nextSn;
338
+ /** 退订(幂等)。 */
339
+ private unsubscribeAll;
340
+ }
341
+ //#endregion
307
342
  //#region src/satori/event/translate.d.ts
308
343
  /** 事件内容(不含 sn/login,由 adapter 包一层完整 Event)。 */
309
344
  interface SatoriEventContent {
@@ -319,32 +354,6 @@ interface SatoriEventContent {
319
354
  /** 事件翻译依赖(selfUin + uidToUin)。 */
320
355
  interface SatoriEventDeps extends SatoriTranslateDeps {}
321
356
  //#endregion
322
- //#region src/satori/helper/canonical.d.ts
323
- /** 收方向依赖(at uid 解析)。 */
324
- interface CanonicalToSatoriDeps {
325
- /** uid → uin(at 目标显示用;未提供原样返回 uid)。 */
326
- uidToUin?: (uids: string[]) => Promise<Map<string, string>>;
327
- }
328
- /**
329
- * 收方向:kernel canonical 元素 → Satori 元素树(纯函数映射,宽容忽略 unknown)。
330
- * at 目标为 uid 时经 uidToUin 转换(异步);无转换器时原样。
331
- */
332
- declare function canonicalToSatoriElements(elements: CanonicalElement[], deps?: CanonicalToSatoriDeps): Promise<SatoriElement[]>;
333
- //#endregion
334
- //#region src/satori/helper/error.d.ts
335
- /** KernelErrorCode → HTTP 状态码映射表。 */
336
- declare const satoriHttpStatusMap: Record<KernelErrorCode, number>;
337
- /** HTTP 状态码常量。 */
338
- declare const HTTP_STATUS: {
339
- readonly ok: 200;
340
- readonly badRequest: 400;
341
- readonly unauthorized: 401;
342
- readonly forbidden: 403;
343
- readonly notFound: 404;
344
- readonly notImplemented: 501;
345
- readonly serverError: 500;
346
- };
347
- //#endregion
348
357
  //#region src/satori/types/api.d.ts
349
358
  /**
350
359
  * Satori 分页与通用 API 类型(协议 v1,规范参考 satori.chat/zh-CN/protocol/api.html)
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/satori/action/base-action.ts","../../src/satori/helper/element.ts","../../src/satori/helper/element-convert.ts","../../src/satori/api/satori-api.ts","../../src/satori/action/registry.ts","../../src/satori/action/index.ts","../../src/satori/helper/config.ts","../../src/satori/adapter.ts","../../src/satori/types/resource.ts","../../src/satori/helper/translate.ts","../../src/satori/event/translate.ts","../../src/satori/helper/canonical.ts","../../src/satori/helper/error.ts","../../src/satori/types/api.ts","../../src/satori/types/event.ts","../../src/satori/transport.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/satori/action/base-action.ts","../../src/satori/helper/element/element.ts","../../src/satori/helper/element/canonical.ts","../../src/satori/helper/element/deps.ts","../../src/satori/helper/element/element-convert.ts","../../src/satori/api/satori-api.ts","../../src/satori/action/registry.ts","../../src/satori/action/index.ts","../../src/satori/helper/config.ts","../../src/satori/helper/error.ts","../../src/satori/types/resource.ts","../../src/satori/helper/translate.ts","../../src/satori/adapter.ts","../../src/satori/event/translate.ts","../../src/satori/types/api.ts","../../src/satori/types/event.ts","../../src/satori/transport.ts"],"mappings":"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"}