@napuketto/adapter 0.4.0 → 0.4.2

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.
@@ -1,2 +1,2 @@
1
- import { a as AdapterRegistry, i as BaseAction, n as ProtocolConfig, o as ActionRegistry, r as BaseProtocolAdapter, t as ensureSilk } from "../core-of7sLiQX.mjs";
1
+ import { a as AdapterRegistry, i as BaseAction, n as ProtocolConfig, o as ActionRegistry, r as BaseProtocolAdapter, t as ensureSilk } from "../core-DyXyDUcU.mjs";
2
2
  export { ActionRegistry, AdapterRegistry, BaseAction, BaseProtocolAdapter, ProtocolConfig, ensureSilk };
@@ -119,7 +119,7 @@ var BaseProtocolAdapter = class {
119
119
  }
120
120
  /** 配置热更新:重新加载 → 校验 → 协议层处理。 */
121
121
  async reload() {
122
- const config = await this.config.reload();
122
+ const config = await this.config.load();
123
123
  await this.hooks.onReload(config);
124
124
  }
125
125
  /** 广播协议事件给所有 network 适配器。 */
@@ -180,4 +180,4 @@ async function ensureSilk(path) {
180
180
  //#endregion
181
181
  export { AdapterRegistry as a, BaseAction as i, ProtocolConfig as n, ActionRegistry as o, BaseProtocolAdapter as r, ensureSilk as t };
182
182
 
183
- //# sourceMappingURL=core-of7sLiQX.mjs.map
183
+ //# sourceMappingURL=core-DyXyDUcU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"core-of7sLiQX.mjs","names":[],"sources":["../src/core/action-registry.ts","../src/core/adapter-registry.ts","../src/core/base-action.ts","../src/core/base-protocol-adapter.ts","../src/core/config.ts","../src/core/media.ts"],"sourcesContent":["/**\n * 动作注册表:按动作名索引(构建后只读)。\n * 泛型化(2026-08-08 克隆合并):OB11 与 Satori 共用同一注册表实现。\n */\nimport type { BaseAction } from \"./base-action.js\";\n\nexport class ActionRegistry<TAction extends { name: string } = BaseAction<unknown, unknown>> {\n private readonly actions = new Map<string, TAction>();\n\n register(action: TAction): void {\n this.actions.set(action.name, action);\n }\n\n get(name: string): TAction | undefined {\n return this.actions.get(name);\n }\n\n has(name: string): boolean {\n return this.actions.has(name);\n }\n\n get names(): string[] {\n return [...this.actions.keys()];\n }\n}\n","/**\n * 适配器注册表:cli 按 enabledProtocols 装配用。\n */\n\n/** 协议适配器基类类型(避免 core 与具体协议循环依赖的轻量接口)。 */\nexport interface ProtocolAdapterLike {\n readonly protocol: string;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n}\n\nexport class AdapterRegistry {\n private readonly adapters = new Map<string, ProtocolAdapterLike>();\n\n register(adapter: ProtocolAdapterLike): void {\n this.adapters.set(adapter.protocol, adapter);\n }\n\n get(protocol: string): ProtocolAdapterLike | undefined {\n return this.adapters.get(protocol);\n }\n\n async startAll(): Promise<void> {\n await Promise.all([...this.adapters.values()].map((a) => a.start()));\n }\n\n async stopAll(): Promise<void> {\n await Promise.all([...this.adapters.values()].map((a) => a.stop()));\n }\n}\n","/**\n * BaseAction:协议动作基类(zod 校验 + 统一错误映射)\n *\n * 各协议动作继承并实现 `_handle`;`handle`(HTTP)/ `websocketHandle`(WS)\n * 统一做 zod 校验 + KernelError → 协议错误码映射。\n */\n\nimport type { KernelErrorCode } from \"@napuketto/kernel\";\nimport type { ZodType } from \"zod\";\n\n/** 校验失败 retcode:HTTP 入口。 */\nconst INVALID_RETCODE_HTTP = 400;\n/** 校验失败 retcode:WS 入口。 */\nconst INVALID_RETCODE_WS = 1400;\n\n/** 动作执行结果(含 retcode,协议错误码由协议层映射表提供)。 */\nexport interface ActionResult<T> {\n retcode: number;\n status: string;\n data: T | null;\n message: string;\n echo?: unknown;\n}\n\n/** 协议错误码映射表:KernelErrorCode → 协议错误码(各协议各自实现,ADR-017)。 */\nexport type ErrorCodeMap = Record<KernelErrorCode, number>;\n\n/** 动作基类:校验失败 retcode=400(HTTP)/1400(WS)。 */\nexport abstract class BaseAction<TPayload, TReturn> {\n abstract readonly name: string;\n abstract readonly schema: ZodType<TPayload>;\n protected abstract readonly errorCodeMap: ErrorCodeMap;\n\n /** 校验并执行(HTTP 入口)。 */\n handle(payload: unknown): Promise<ActionResult<TReturn>> {\n return this.run(payload, INVALID_RETCODE_HTTP);\n }\n\n /** 校验并执行(WS 入口,echo 透传)。 */\n async websocketHandle(payload: unknown, echo?: unknown): Promise<ActionResult<TReturn>> {\n const result = await this.run(payload, INVALID_RETCODE_WS);\n if (echo !== undefined) {\n result.echo = echo;\n }\n return result;\n }\n\n private async run(payload: unknown, invalidRetcode: number): Promise<ActionResult<TReturn>> {\n const parsed = this.schema.safeParse(payload);\n if (!parsed.success) {\n return this.fail(invalidRetcode, \"参数校验失败\");\n }\n try {\n const data = await this._handle(parsed.data);\n return { retcode: 0, status: \"ok\", data, message: \"\" };\n } catch (err) {\n return this.mapError(err);\n }\n }\n\n protected abstract _handle(payload: TPayload): Promise<TReturn>;\n\n private mapError(err: unknown): ActionResult<TReturn> {\n if (err instanceof Error && \"code\" in err) {\n const typed = err as Error & { code: KernelErrorCode };\n //从断言联合类型访问 code,解构会丢失 err 其余属性\n const retcode = this.errorCodeMap[typed.code] ?? this.errorCodeMap[\"UNKNOWN\"];\n return { retcode, status: \"failed\", data: null, message: err.message };\n }\n if (err instanceof Error) {\n return this.fail(this.errorCodeMap[\"UNKNOWN\"], err.message);\n }\n return this.fail(this.errorCodeMap[\"UNKNOWN\"], \"未知错误\");\n }\n\n private fail(retcode: number, message: string): ActionResult<TReturn> {\n return { retcode, status: \"failed\", data: null, message };\n }\n}\n","/**\n * BaseProtocolAdapter:协议适配器骨架(ADR-013,只写一次,各协议薄映射)\n *\n * 生命周期:start(校验配置 → 协议层初始化 → 启动传输)→ stop。\n * 请求分发:协议层把 network 的 onRequest 绑定到 `handleRequest`。\n * 事件广播:协议层翻译 kernel 事件后经 `broadcastEvent` 推给 network。\n */\nimport type { EventBroadcaster } from \"@napuketto/network\";\nimport type { ProtocolConfig } from \"./config.js\";\n\n/** 适配器生命周期钩子:由协议层实现(配置校验、初始化、资源清理)。 */\nexport interface ProtocolHooks {\n /** 配置校验通过后初始化(如建立 kernel 事件订阅)。 */\n onStart: (config: unknown) => Promise<void>;\n /** 停止时清理资源(退订、关闭传输等)。 */\n onStop: () => Promise<void>;\n /** 配置热更新。 */\n onReload: (config: unknown) => Promise<void>;\n}\n\n/**\n * 协议适配器骨架。\n * @typeParam TConfig - 协议配置类型\n */\nexport abstract class BaseProtocolAdapter<TConfig> {\n abstract readonly protocol: string;\n\n protected readonly config: ProtocolConfig<TConfig>;\n protected readonly hooks: ProtocolHooks;\n private readonly broadcaster: EventBroadcaster | undefined;\n private started = false;\n\n constructor(opts: {\n config: ProtocolConfig<TConfig>;\n hooks: ProtocolHooks;\n broadcaster?: EventBroadcaster;\n }) {\n this.config = opts.config;\n this.hooks = opts.hooks;\n this.broadcaster = opts.broadcaster;\n }\n\n /** 启动:加载配置 → 校验 → 协议层初始化。 */\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n const config = await this.config.load();\n await this.hooks.onStart(config);\n this.started = true;\n }\n\n /** 停止:协议层清理资源。 */\n async stop(): Promise<void> {\n if (!this.started) {\n return;\n }\n await this.hooks.onStop();\n this.started = false;\n }\n\n /** 配置热更新:重新加载 → 校验 → 协议层处理。 */\n async reload(): Promise<void> {\n const config = await this.config.reload();\n await this.hooks.onReload(config);\n }\n\n /** 广播协议事件给所有 network 适配器。 */\n protected broadcastEvent<T>(event: T): void {\n this.broadcaster?.emit(event);\n }\n\n /** 获取广播器(传输装配等内部使用;未传入返回 undefined)。 */\n protected getBroadcaster(): EventBroadcaster | undefined {\n return this.broadcaster;\n }\n}\n","/**\n * 协议配置加载基类:复用 kernel ConfigBase(zod schema 天然满足其校验器接口)。\n */\nimport type { ConfigFormat } from \"@napuketto/kernel\";\nimport { ConfigBase } from \"@napuketto/kernel\";\nimport type { ZodType } from \"zod\";\n\n/** 协议配置基类:zod schema + 文本读写(JSON/TOML,文件路径由装配层传入)。 */\nexport class ProtocolConfig<T> extends ConfigBase<T> {\n constructor(opts: {\n path: string;\n schema: ZodType<T>;\n defaults: T;\n /** 内存初值(全局 TOML 分段装配:seed 存在时 load() 直接用它)。 */\n seed?: T;\n format?: ConfigFormat;\n }) {\n super({\n path: opts.path,\n schema: opts.schema,\n defaults: opts.defaults,\n seed: opts.seed,\n format: opts.format,\n });\n }\n}\n","/**\n * adapter core 媒体辅助:语音归一化(ADR-011 media 严格解耦的协议层落点)\n *\n * 协议层(onebot11 / satori)发送语音前统一走 ensureSilk:把非 silk 音频\n * 转成 QQ 语音格式(silk v3)。转码依赖 @napuketto/media(encodePcmToSilk),\n * 只发生在 adapter 层;kernel 不 import media(红线),只接收已是 silk 的路径。\n */\nimport { open } from \"node:fs/promises\";\nimport { encodePcmToSilk } from \"@napuketto/media\";\n\n/** 读文件头 8 字节(判断 silk 魔数)。 */\nasync function readFileHead(path: string): Promise<string> {\n const handle = await open(path, \"r\");\n try {\n const buf = Buffer.alloc(8);\n await handle.read(buf, 0, 8, 0);\n return buf.toString(\"utf8\");\n } finally {\n await handle.close();\n }\n}\n\n/**\n * 语音转码:非 silk 输入(任意音频格式,经 @napuketto/media 归一化)转 silk。\n * 已是 silk(#!SILK_V3 头)原样返回;转码失败原样返回(由 kernel 发送时兜底)。\n */\nexport async function ensureSilk(path: string): Promise<string> {\n try {\n const header = await readFileHead(path);\n if (header.startsWith(\"#!SILK\")) {\n return path;\n }\n return await encodePcmToSilk(path);\n } catch {\n return path;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core-DyXyDUcU.mjs","names":[],"sources":["../src/core/action-registry.ts","../src/core/adapter-registry.ts","../src/core/base-action.ts","../src/core/base-protocol-adapter.ts","../src/core/config.ts","../src/core/media.ts"],"sourcesContent":["/**\n * 动作注册表:按动作名索引(构建后只读)。\n * 泛型化(2026-08-08 克隆合并):OB11 与 Satori 共用同一注册表实现。\n */\nimport type { BaseAction } from \"./base-action.js\";\n\nexport class ActionRegistry<TAction extends { name: string } = BaseAction<unknown, unknown>> {\n private readonly actions = new Map<string, TAction>();\n\n register(action: TAction): void {\n this.actions.set(action.name, action);\n }\n\n get(name: string): TAction | undefined {\n return this.actions.get(name);\n }\n\n has(name: string): boolean {\n return this.actions.has(name);\n }\n\n get names(): string[] {\n return [...this.actions.keys()];\n }\n}\n","/**\n * 适配器注册表:cli 按 enabledProtocols 装配用。\n */\n\n/** 协议适配器基类类型(避免 core 与具体协议循环依赖的轻量接口)。 */\nexport interface ProtocolAdapterLike {\n readonly protocol: string;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n}\n\nexport class AdapterRegistry {\n private readonly adapters = new Map<string, ProtocolAdapterLike>();\n\n register(adapter: ProtocolAdapterLike): void {\n this.adapters.set(adapter.protocol, adapter);\n }\n\n get(protocol: string): ProtocolAdapterLike | undefined {\n return this.adapters.get(protocol);\n }\n\n async startAll(): Promise<void> {\n await Promise.all([...this.adapters.values()].map((a) => a.start()));\n }\n\n async stopAll(): Promise<void> {\n await Promise.all([...this.adapters.values()].map((a) => a.stop()));\n }\n}\n","/**\n * BaseAction:协议动作基类(zod 校验 + 统一错误映射)\n *\n * 各协议动作继承并实现 `_handle`;`handle`(HTTP)/ `websocketHandle`(WS)\n * 统一做 zod 校验 + KernelError → 协议错误码映射。\n */\n\nimport type { KernelErrorCode } from \"@napuketto/kernel\";\nimport type { ZodType } from \"zod\";\n\n/** 校验失败 retcode:HTTP 入口。 */\nconst INVALID_RETCODE_HTTP = 400;\n/** 校验失败 retcode:WS 入口。 */\nconst INVALID_RETCODE_WS = 1400;\n\n/** 动作执行结果(含 retcode,协议错误码由协议层映射表提供)。 */\nexport interface ActionResult<T> {\n retcode: number;\n status: string;\n data: T | null;\n message: string;\n echo?: unknown;\n}\n\n/** 协议错误码映射表:KernelErrorCode → 协议错误码(各协议各自实现,ADR-017)。 */\nexport type ErrorCodeMap = Record<KernelErrorCode, number>;\n\n/** 动作基类:校验失败 retcode=400(HTTP)/1400(WS)。 */\nexport abstract class BaseAction<TPayload, TReturn> {\n abstract readonly name: string;\n abstract readonly schema: ZodType<TPayload>;\n protected abstract readonly errorCodeMap: ErrorCodeMap;\n\n /** 校验并执行(HTTP 入口)。 */\n handle(payload: unknown): Promise<ActionResult<TReturn>> {\n return this.run(payload, INVALID_RETCODE_HTTP);\n }\n\n /** 校验并执行(WS 入口,echo 透传)。 */\n async websocketHandle(payload: unknown, echo?: unknown): Promise<ActionResult<TReturn>> {\n const result = await this.run(payload, INVALID_RETCODE_WS);\n if (echo !== undefined) {\n result.echo = echo;\n }\n return result;\n }\n\n private async run(payload: unknown, invalidRetcode: number): Promise<ActionResult<TReturn>> {\n const parsed = this.schema.safeParse(payload);\n if (!parsed.success) {\n return this.fail(invalidRetcode, \"参数校验失败\");\n }\n try {\n const data = await this._handle(parsed.data);\n return { retcode: 0, status: \"ok\", data, message: \"\" };\n } catch (err) {\n return this.mapError(err);\n }\n }\n\n protected abstract _handle(payload: TPayload): Promise<TReturn>;\n\n private mapError(err: unknown): ActionResult<TReturn> {\n if (err instanceof Error && \"code\" in err) {\n const typed = err as Error & { code: KernelErrorCode };\n //从断言联合类型访问 code,解构会丢失 err 其余属性\n const retcode = this.errorCodeMap[typed.code] ?? this.errorCodeMap[\"UNKNOWN\"];\n return { retcode, status: \"failed\", data: null, message: err.message };\n }\n if (err instanceof Error) {\n return this.fail(this.errorCodeMap[\"UNKNOWN\"], err.message);\n }\n return this.fail(this.errorCodeMap[\"UNKNOWN\"], \"未知错误\");\n }\n\n private fail(retcode: number, message: string): ActionResult<TReturn> {\n return { retcode, status: \"failed\", data: null, message };\n }\n}\n","/**\n * BaseProtocolAdapter:协议适配器骨架(ADR-013,只写一次,各协议薄映射)\n *\n * 生命周期:start(校验配置 → 协议层初始化 → 启动传输)→ stop。\n * 请求分发:协议层把 network 的 onRequest 绑定到 `handleRequest`。\n * 事件广播:协议层翻译 kernel 事件后经 `broadcastEvent` 推给 network。\n */\nimport type { EventBroadcaster } from \"@napuketto/network\";\nimport type { ProtocolConfig } from \"./config.js\";\n\n/** 适配器生命周期钩子:由协议层实现(配置校验、初始化、资源清理)。 */\nexport interface ProtocolHooks {\n /** 配置校验通过后初始化(如建立 kernel 事件订阅)。 */\n onStart: (config: unknown) => Promise<void>;\n /** 停止时清理资源(退订、关闭传输等)。 */\n onStop: () => Promise<void>;\n /** 配置热更新。 */\n onReload: (config: unknown) => Promise<void>;\n}\n\n/**\n * 协议适配器骨架。\n * @typeParam TConfig - 协议配置类型\n */\nexport abstract class BaseProtocolAdapter<TConfig> {\n abstract readonly protocol: string;\n\n protected readonly config: ProtocolConfig<TConfig>;\n protected readonly hooks: ProtocolHooks;\n private readonly broadcaster: EventBroadcaster | undefined;\n private started = false;\n\n constructor(opts: {\n config: ProtocolConfig<TConfig>;\n hooks: ProtocolHooks;\n broadcaster?: EventBroadcaster;\n }) {\n this.config = opts.config;\n this.hooks = opts.hooks;\n this.broadcaster = opts.broadcaster;\n }\n\n /** 启动:加载配置 → 校验 → 协议层初始化。 */\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n const config = await this.config.load();\n await this.hooks.onStart(config);\n this.started = true;\n }\n\n /** 停止:协议层清理资源。 */\n async stop(): Promise<void> {\n if (!this.started) {\n return;\n }\n await this.hooks.onStop();\n this.started = false;\n }\n\n /** 配置热更新:重新加载 → 校验 → 协议层处理。 */\n async reload(): Promise<void> {\n // ConfigBase.reload() 原为 load() 的别名(已在 kernel 侧作为死代码删除),\n // 热更新语义即重新 load,行为不变。\n const config = await this.config.load();\n await this.hooks.onReload(config);\n }\n\n /** 广播协议事件给所有 network 适配器。 */\n protected broadcastEvent<T>(event: T): void {\n this.broadcaster?.emit(event);\n }\n\n /** 获取广播器(传输装配等内部使用;未传入返回 undefined)。 */\n protected getBroadcaster(): EventBroadcaster | undefined {\n return this.broadcaster;\n }\n}\n","/**\n * 协议配置加载基类:复用 kernel ConfigBase(zod schema 天然满足其校验器接口)。\n */\nimport type { ConfigFormat } from \"@napuketto/kernel\";\nimport { ConfigBase } from \"@napuketto/kernel\";\nimport type { ZodType } from \"zod\";\n\n/** 协议配置基类:zod schema + 文本读写(JSON/TOML,文件路径由装配层传入)。 */\nexport class ProtocolConfig<T> extends ConfigBase<T> {\n constructor(opts: {\n path: string;\n schema: ZodType<T>;\n defaults: T;\n /** 内存初值(全局 TOML 分段装配:seed 存在时 load() 直接用它)。 */\n seed?: T;\n format?: ConfigFormat;\n }) {\n super({\n path: opts.path,\n schema: opts.schema,\n defaults: opts.defaults,\n seed: opts.seed,\n format: opts.format,\n });\n }\n}\n","/**\n * adapter core 媒体辅助:语音归一化(ADR-011 media 严格解耦的协议层落点)\n *\n * 协议层(onebot11 / satori)发送语音前统一走 ensureSilk:把非 silk 音频\n * 转成 QQ 语音格式(silk v3)。转码依赖 @napuketto/media(encodePcmToSilk),\n * 只发生在 adapter 层;kernel 不 import media(红线),只接收已是 silk 的路径。\n */\nimport { open } from \"node:fs/promises\";\nimport { encodePcmToSilk } from \"@napuketto/media\";\n\n/** 读文件头 8 字节(判断 silk 魔数)。 */\nasync function readFileHead(path: string): Promise<string> {\n const handle = await open(path, \"r\");\n try {\n const buf = Buffer.alloc(8);\n await handle.read(buf, 0, 8, 0);\n return buf.toString(\"utf8\");\n } finally {\n await handle.close();\n }\n}\n\n/**\n * 语音转码:非 silk 输入(任意音频格式,经 @napuketto/media 归一化)转 silk。\n * 已是 silk(#!SILK_V3 头)原样返回;转码失败原样返回(由 kernel 发送时兜底)。\n */\nexport async function ensureSilk(path: string): Promise<string> {\n try {\n const header = await readFileHead(path);\n if (header.startsWith(\"#!SILK\")) {\n return path;\n }\n return await encodePcmToSilk(path);\n } catch {\n return path;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index-CDKj-jus.d.mts","names":[],"sources":["../src/core/base-action.ts","../src/core/action-registry.ts","../src/core/adapter-registry.ts","../src/core/config.ts","../src/core/base-protocol-adapter.ts","../src/core/media.ts"],"mappings":";;;;;UAgBiB,aAAa;EAC1B;EACA;EACA,MAAM;EACN;EACA;;;KAIQ,eAAe,OAAO;;uBAGZ,WAAW,UAAU;oBACrB;oBACA,QAAQ,QAAQ;8BACN,cAAc;;EAG1C,OAAO,mBAAmB,QAAQ,aAAa;;EAKzC,gBAAgB,kBAAkB,iBAAiB,QAAQ,aAAa;UAQhE;qBAaK,QAAQ,SAAS,WAAW,QAAQ;UAE/C;UAaA;;;;cCrEC,eAAe;EAAkB;IAAiB;mBAC1C;EAEjB,SAAS,QAAQ;EAIjB,IAAI,eAAe;EAInB,IAAI;MAIA;;;;;;;;UChBS;WACJ;EACT,aAAa;EACb,YAAY;;cAGH;mBACQ;EAEjB,SAAS,SAAS;EAIlB,IAAI,mBAAmB;EAIjB,YAAY;EAIZ,WAAW;;;;;cClBR,eAAe,WAAW,WAAW;EAC9C,YAAY;IACR;IACA,QAAQ,QAAQ;IAChB,UAAU;;IAEV,OAAO;IACP,SAAS;;;;;;UCJA;;EAEb,UAAU,oBAAoB;;EAE9B,cAAc;;EAEd,WAAW,oBAAoB;;;;;;uBAOb,oBAAoB;oBACpB;qBAEC,QAAQ,eAAe;qBACvB,OAAO;mBACT;UACT;EAER,YAAY;IACR,QAAQ,eAAe;IACvB,OAAO;IACP,cAAc;;;EAQZ,SAAS;;EAUT,QAAQ;;EASR,UAAU;;YAMN,eAAe,GAAG,OAAO;;YAKzB,kBAAkB;;;;;;;;iBC/CV,WAAW,eAAe"}
1
+ {"version":3,"file":"index-CDKj-jus.d.mts","names":[],"sources":["../src/core/base-action.ts","../src/core/action-registry.ts","../src/core/adapter-registry.ts","../src/core/config.ts","../src/core/base-protocol-adapter.ts","../src/core/media.ts"],"mappings":";;;;;UAgBiB,aAAa;EAC1B;EACA;EACA,MAAM;EACN;EACA;;;KAIQ,eAAe,OAAO;;uBAGZ,WAAW,UAAU;oBACrB;oBACA,QAAQ,QAAQ;8BACN,cAAc;;EAG1C,OAAO,mBAAmB,QAAQ,aAAa;;EAKzC,gBAAgB,kBAAkB,iBAAiB,QAAQ,aAAa;UAQhE;qBAaK,QAAQ,SAAS,WAAW,QAAQ;UAE/C;UAaA;;;;cCrEC,eAAe;EAAkB;IAAiB;mBAC1C;EAEjB,SAAS,QAAQ;EAIjB,IAAI,eAAe;EAInB,IAAI;MAIA;;;;;;;;UChBS;WACJ;EACT,aAAa;EACb,YAAY;;cAGH;mBACQ;EAEjB,SAAS,SAAS;EAIlB,IAAI,mBAAmB;EAIjB,YAAY;EAIZ,WAAW;;;;;cClBR,eAAe,WAAW,WAAW;EAC9C,YAAY;IACR;IACA,QAAQ,QAAQ;IAChB,UAAU;;IAEV,OAAO;IACP,SAAS;;;;;;UCJA;;EAEb,UAAU,oBAAoB;;EAE9B,cAAc;;EAEd,WAAW,oBAAoB;;;;;;uBAOb,oBAAoB;oBACpB;qBAEC,QAAQ,eAAe;qBACvB,OAAO;mBACT;UACT;EAER,YAAY;IACR,QAAQ,eAAe;IACvB,OAAO;IACP,cAAc;;;EAQZ,SAAS;;EAUT,QAAQ;;EASR,UAAU;;YAQN,eAAe,GAAG,OAAO;;YAKzB,kBAAkB;;;;;;;;iBCjDV,WAAW,eAAe"}
@@ -1,4 +1,4 @@
1
- import { r as BaseProtocolAdapter } from "../core-of7sLiQX.mjs";
1
+ import { r as BaseProtocolAdapter } from "../core-DyXyDUcU.mjs";
2
2
  import { t as forEachRawMessage } from "../raw-message-6KdlG8kR.mjs";
3
3
  import { createRequire } from "node:module";
4
4
  import { ChatType, toCanonicalElements } from "@napuketto/kernel";
@@ -3,137 +3,6 @@ import "../gray-tip-8zPh4d9W.mjs";
3
3
  import { BuddyCacheEventChannel, BuddyEventChannel, CanonicalElement, ChatType, FriendApi, GroupApi, GroupCache, GroupEventChannel, GroupNotifyApi, MsgApi, MsgEventChannel, Peer, ProfileApi, ProfileLikeApi, RawMessage, RichMediaApi, TicketApi, WebApi } from "@napuketto/kernel";
4
4
  import { z } from "zod";
5
5
  import { EventBroadcaster, TransportAdapter } from "@napuketto/network";
6
- //#region src/onebot11/helper/message-unique.d.ts
7
- declare class MessageUnique {
8
- /** NT msgId → OB11 message_id。 */
9
- private readonly msgIdToInt;
10
- /** OB11 message_id → NT msgId。 */
11
- private readonly intToMsgId;
12
- /** NT msgId → Peer(delete_msg / get_msg 等只有 message_id 时反查用)。 */
13
- private readonly msgIdToPeer;
14
- /** 递增计数器。 */
15
- private cursor;
16
- /** 已释放的槽位(可复用)。 */
17
- private readonly freed;
18
- /**
19
- * 为新 NT 消息分配 OB11 message_id(幂等:同一 msgId 返回同一 id)。
20
- * peer 可选:传入则记录,供 message_id → peer 反查。
21
- */
22
- alloc(msgId: string, peer?: Peer): number;
23
- /** OB11 message_id → NT msgId。 */
24
- getMsgId(messageId: number): string | undefined;
25
- /** NT msgId → OB11 message_id(未分配返回 undefined)。 */
26
- getMessageId(msgId: string): number | undefined;
27
- /** NT msgId → Peer(alloc 时未记录返回 undefined)。 */
28
- getPeer(msgId: string): Peer | undefined;
29
- /** 释放 NT msgId 占用的槽位(消息过期/删除时调用,可选)。 */
30
- release(msgId: string): void;
31
- /** 取下一个可用 id:优先释放池,否则递增(溢出后线性扫描空洞)。 */
32
- private nextFreeId;
33
- }
34
- //#endregion
35
- //#region src/onebot11/api/one-bot-api.d.ts
36
- /** 系统类本地回调(get_version_info / clean_cache / download_file / 进程控制用)。 */
37
- interface OneBotSystemOptions {
38
- /** 运行版本(get_version_info 用,缺省 unknown)。 */
39
- appVersion: string;
40
- /** 缓存清理回调(clean_cache 用,未配置抛错)。 */
41
- cleanCache?: () => Promise<void>;
42
- /** 缓存目录(download_file 保存路径 / get_image 主动下载落盘)。 */
43
- cacheDir?: string;
44
- /** QQ NT global 目录(get_image/get_record 解析 NT 相对路径用,2026-09-08 T5)。 */
45
- mediaBaseDir?: string;
46
- /** 进程退出回调(bot_exit 用)。 */
47
- exit?: () => Promise<void>;
48
- /** 进程重启回调(set_restart 用,缺省退化为退出)。 */
49
- restart?: () => Promise<void>;
50
- }
51
- /** OneBotApi 构造参数。 */
52
- interface OneBotApiOptions {
53
- msgApi: MsgApi;
54
- groupApi: GroupApi;
55
- groupNotifyApi: GroupNotifyApi;
56
- friendApi: FriendApi;
57
- ticketApi: TicketApi;
58
- richMediaApi: RichMediaApi;
59
- profileApi: ProfileApi;
60
- profileLikeApi: ProfileLikeApi;
61
- webApi: WebApi;
62
- /** 登录身份(get_login_info 用)。 */
63
- self: {
64
- uin: string;
65
- nickname: string;
66
- };
67
- /** 系统类本地信息。 */
68
- system: OneBotSystemOptions;
69
- /** 群/成员缓存(ADR-008,读缓存动作用;未装配时动作直查 api)。 */
70
- groupCache?: GroupCache;
71
- }
72
- /**
73
- * OneBot 11 动作统一依赖聚合(P2-16)。
74
- * 各动作经 `Pick<OneBotApi, ...>` 取所需成员;注册处只构造一次本对象。
75
- */
76
- declare class OneBotApi {
77
- /** kernel 消息 API(send_msg 等消息类动作用)。 */
78
- readonly msgApi: MsgApi;
79
- /** kernel 群 API。 */
80
- readonly groupApi: GroupApi;
81
- /** kernel 群通知 API(群请求/禁言列表用)。 */
82
- readonly groupNotifyApi: GroupNotifyApi;
83
- /** kernel 好友 API。 */
84
- readonly friendApi: FriendApi;
85
- /** kernel 票据 API(get_clientkey/get_cookies 用)。 */
86
- readonly ticketApi: TicketApi;
87
- /** kernel 富媒体 API(群文件/翻译用)。 */
88
- readonly richMediaApi: RichMediaApi;
89
- /** kernel 资料 API(签名/昵称/头像用)。 */
90
- readonly profileApi: ProfileApi;
91
- /** kernel 点赞 API(send_like 用)。 */
92
- readonly profileLikeApi: ProfileLikeApi;
93
- /** kernel 群空间 web API(精华/荣誉用)。 */
94
- readonly webApi: WebApi;
95
- /** 群/成员缓存(ADR-008;翻译层只读消费,缺失惰性回填)。 */
96
- readonly groupCache: GroupCache | undefined;
97
- /** OB11 message_id ↔ NT msgId 双向映射(收链路与动作共用同一映射空间)。 */
98
- readonly messageUnique: MessageUnique;
99
- /** 登录身份(get_login_info 用)。 */
100
- readonly self: {
101
- uin: string;
102
- nickname: string;
103
- };
104
- /** 机器人自身 uin(get_cookies / csrf 用)。 */
105
- readonly selfUin: string;
106
- /** 运行版本(get_version_info 用)。 */
107
- readonly appVersion: string;
108
- /** 缓存清理回调(clean_cache 用)。 */
109
- readonly cleanCache: (() => Promise<void>) | undefined;
110
- /** 缓存目录(download_file 用)。 */
111
- readonly cacheDir: string | undefined;
112
- /** QQ NT global 目录(媒体 NT 相对路径解析用)。 */
113
- readonly mediaBaseDir: string | undefined;
114
- /** 进程退出回调(bot_exit 用)。 */
115
- readonly exit: (() => Promise<void>) | undefined;
116
- /** 进程重启回调(set_restart 用)。 */
117
- readonly restart: (() => Promise<void>) | undefined;
118
- constructor(opts: OneBotApiOptions);
119
- /** uin→uid 转换(委托 groupApi;私聊目标/成员 user_id 用)。 */
120
- uinToUid(uins: string[]): Promise<Map<string, string>>;
121
- /** uid→uin 转换(委托 groupApi;notice/grayTip 用)。 */
122
- uidToUin(uids: string[]): Promise<Map<string, string>>;
123
- }
124
- //#endregion
125
- //#region src/onebot11/action/error-map.d.ts
126
- /** OB11 错误码映射表(send_msg 等所有 OB11 动作共用)。 */
127
- declare const ob11ErrorCodeMap: ErrorCodeMap;
128
- //#endregion
129
- //#region src/onebot11/action/group/get-group-at-all-remain.d.ts
130
- /** @全体剩余次数返回结构。 */
131
- interface AtAllRemainInfo {
132
- can_at_all: boolean;
133
- remain_at_all_count_for_uin: number;
134
- remain_at_all_count_for_group: number;
135
- }
136
- //#endregion
137
6
  //#region src/onebot11/types/index.d.ts
138
7
  /**
139
8
  * OneBot 11 类型定义(自研描述,参考公开协议规范)
@@ -334,6 +203,168 @@ interface VersionInfo {
334
203
  walle_version?: string;
335
204
  }
336
205
  //#endregion
206
+ //#region src/onebot11/helper/data.d.ts
207
+ /** canonical 元素数组 → OB11 segment 数组(无法表达的元素静默跳过)。 */
208
+ declare function canonicalToSegments(elements: CanonicalElement[]): OB11MessageSegment[];
209
+ /** OB11 segment 数组 → canonical 元素数组。 */
210
+ declare function segmentsToCanonical(segments: OB11MessageSegment[]): CanonicalElement[];
211
+ /**
212
+ * 接收方向翻译上下文(ID 空间转换,P2-19,2026-08-07)。
213
+ * 翻译核心保持纯函数(ADR-008),调用方在协议边界准备上下文注入:
214
+ * canonical 的 at.target 是 NT uid、reply.messageId 是 NT 雪花 msgId,
215
+ * OB11 需要 uin / OB11 message_id。
216
+ */
217
+ /** OB11 sender.role 值域(群聊;私聊 sender 无 role)。 */
218
+ type GroupSenderRole = "owner" | "admin" | "member";
219
+ /** CQ 码字符串 → OB11 segment 数组(未知 CQ 类型保留为 text 段原文)。 */
220
+ declare function cqMessageToSegments(text: string): OB11MessageSegment[];
221
+ /** canonical 元素数组 → CQ 码字符串。 */
222
+ declare function canonicalToCqMessage(elements: CanonicalElement[]): string;
223
+ /** CQ 码字符串 → canonical 元素数组。 */
224
+ declare function cqMessageToCanonical(text: string): CanonicalElement[];
225
+ //#endregion
226
+ //#region src/onebot11/helper/message-unique.d.ts
227
+ declare class MessageUnique {
228
+ /** NT msgId → OB11 message_id。 */
229
+ private readonly msgIdToInt;
230
+ /** OB11 message_id → NT msgId。 */
231
+ private readonly intToMsgId;
232
+ /** NT msgId → Peer(delete_msg / get_msg 等只有 message_id 时反查用)。 */
233
+ private readonly msgIdToPeer;
234
+ /** 递增计数器。 */
235
+ private cursor;
236
+ /** 已释放的槽位(可复用)。 */
237
+ private readonly freed;
238
+ /**
239
+ * 为新 NT 消息分配 OB11 message_id(幂等:同一 msgId 返回同一 id)。
240
+ * peer 可选:传入则记录,供 message_id → peer 反查。
241
+ */
242
+ alloc(msgId: string, peer?: Peer): number;
243
+ /** OB11 message_id → NT msgId。 */
244
+ getMsgId(messageId: number): string | undefined;
245
+ /** NT msgId → OB11 message_id(未分配返回 undefined)。 */
246
+ getMessageId(msgId: string): number | undefined;
247
+ /** NT msgId → Peer(alloc 时未记录返回 undefined)。 */
248
+ getPeer(msgId: string): Peer | undefined;
249
+ /** 释放 NT msgId 占用的槽位(消息过期/删除时调用,可选)。 */
250
+ release(msgId: string): void;
251
+ /** 取下一个可用 id:优先释放池,否则递增(溢出后线性扫描空洞)。 */
252
+ private nextFreeId;
253
+ }
254
+ //#endregion
255
+ //#region src/onebot11/api/one-bot-api.d.ts
256
+ /** 系统类本地回调(get_version_info / clean_cache / download_file / 进程控制用)。 */
257
+ interface OneBotSystemOptions {
258
+ /** 运行版本(get_version_info 用,缺省 unknown)。 */
259
+ appVersion: string;
260
+ /** 缓存清理回调(clean_cache 用,未配置抛错)。 */
261
+ cleanCache?: () => Promise<void>;
262
+ /** 缓存目录(download_file 保存路径 / get_image 主动下载落盘)。 */
263
+ cacheDir?: string;
264
+ /** QQ NT global 目录(get_image/get_record 解析 NT 相对路径用,2026-09-08 T5)。 */
265
+ mediaBaseDir?: string;
266
+ /** 进程退出回调(bot_exit 用)。 */
267
+ exit?: () => Promise<void>;
268
+ /** 进程重启回调(set_restart 用,缺省退化为退出)。 */
269
+ restart?: () => Promise<void>;
270
+ }
271
+ /** OneBotApi 构造参数。 */
272
+ interface OneBotApiOptions {
273
+ msgApi: MsgApi;
274
+ groupApi: GroupApi;
275
+ groupNotifyApi: GroupNotifyApi;
276
+ friendApi: FriendApi;
277
+ ticketApi: TicketApi;
278
+ richMediaApi: RichMediaApi;
279
+ profileApi: ProfileApi;
280
+ profileLikeApi: ProfileLikeApi;
281
+ webApi: WebApi;
282
+ /** 登录身份(get_login_info 用)。 */
283
+ self: {
284
+ uin: string;
285
+ nickname: string;
286
+ };
287
+ /** 系统类本地信息。 */
288
+ system: OneBotSystemOptions;
289
+ /** 群/成员缓存(ADR-008,读缓存动作用;未装配时动作直查 api)。 */
290
+ groupCache?: GroupCache;
291
+ }
292
+ /**
293
+ * OneBot 11 动作统一依赖聚合(P2-16)。
294
+ * 各动作经 `Pick<OneBotApi, ...>` 取所需成员;注册处只构造一次本对象。
295
+ */
296
+ declare class OneBotApi {
297
+ /** kernel 消息 API(send_msg 等消息类动作用)。 */
298
+ readonly msgApi: MsgApi;
299
+ /** kernel 群 API。 */
300
+ readonly groupApi: GroupApi;
301
+ /** kernel 群通知 API(群请求/禁言列表用)。 */
302
+ readonly groupNotifyApi: GroupNotifyApi;
303
+ /** kernel 好友 API。 */
304
+ readonly friendApi: FriendApi;
305
+ /** kernel 票据 API(get_clientkey/get_cookies 用)。 */
306
+ readonly ticketApi: TicketApi;
307
+ /** kernel 富媒体 API(群文件/翻译用)。 */
308
+ readonly richMediaApi: RichMediaApi;
309
+ /** kernel 资料 API(签名/昵称/头像用)。 */
310
+ readonly profileApi: ProfileApi;
311
+ /** kernel 点赞 API(send_like 用)。 */
312
+ readonly profileLikeApi: ProfileLikeApi;
313
+ /** kernel 群空间 web API(精华/荣誉用)。 */
314
+ readonly webApi: WebApi;
315
+ /** 群/成员缓存(ADR-008;翻译层只读消费,缺失惰性回填)。 */
316
+ readonly groupCache: GroupCache | undefined;
317
+ /** OB11 message_id ↔ NT msgId 双向映射(收链路与动作共用同一映射空间)。 */
318
+ readonly messageUnique: MessageUnique;
319
+ /** 登录身份(get_login_info 用)。 */
320
+ readonly self: {
321
+ uin: string;
322
+ nickname: string;
323
+ };
324
+ /** 机器人自身 uin(get_cookies / csrf 用)。 */
325
+ readonly selfUin: string;
326
+ /** 运行版本(get_version_info 用)。 */
327
+ readonly appVersion: string;
328
+ /** 缓存清理回调(clean_cache 用)。 */
329
+ readonly cleanCache: (() => Promise<void>) | undefined;
330
+ /** 缓存目录(download_file 用)。 */
331
+ readonly cacheDir: string | undefined;
332
+ /** QQ NT global 目录(媒体 NT 相对路径解析用)。 */
333
+ readonly mediaBaseDir: string | undefined;
334
+ /** 进程退出回调(bot_exit 用)。 */
335
+ readonly exit: (() => Promise<void>) | undefined;
336
+ /** 进程重启回调(set_restart 用)。 */
337
+ readonly restart: (() => Promise<void>) | undefined;
338
+ constructor(opts: OneBotApiOptions);
339
+ /** uin→uid 转换(委托 groupApi;私聊目标/成员 user_id 用)。 */
340
+ uinToUid(uins: string[]): Promise<Map<string, string>>;
341
+ /** uid→uin 转换(委托 groupApi;notice/grayTip 用)。 */
342
+ uidToUin(uids: string[]): Promise<Map<string, string>>;
343
+ /**
344
+ * 群成员角色(GroupCache 缓存优先,缺失惰性回填;sender.role 判定用)。
345
+ * 未装配缓存 / 成员不在群 / 查询失败 → undefined(调用方回退缺省 "member",
346
+ * 不阻塞消息上报)。
347
+ */
348
+ groupMemberRole(groupCode: string, uid: string): Promise<GroupSenderRole | undefined>;
349
+ /**
350
+ * 群成员角色表(历史消息批量用:一次整表读取,uid → role)。
351
+ * 失败语义同 groupMemberRole。
352
+ */
353
+ groupMemberRoles(groupCode: string): Promise<Map<string, GroupSenderRole> | undefined>;
354
+ }
355
+ //#endregion
356
+ //#region src/onebot11/action/error-map.d.ts
357
+ /** OB11 错误码映射表(send_msg 等所有 OB11 动作共用)。 */
358
+ declare const ob11ErrorCodeMap: ErrorCodeMap;
359
+ //#endregion
360
+ //#region src/onebot11/action/group/get-group-at-all-remain.d.ts
361
+ /** @全体剩余次数返回结构。 */
362
+ interface AtAllRemainInfo {
363
+ can_at_all: boolean;
364
+ remain_at_all_count_for_uin: number;
365
+ remain_at_all_count_for_group: number;
366
+ }
367
+ //#endregion
337
368
  //#region src/onebot11/event/base.d.ts
338
369
  /**
339
370
  * OneBot 11 事件基类(OB11 公开协议规范,自研描述)
@@ -694,18 +725,6 @@ declare const ob11ConfigSchema: z.ZodObject<{
694
725
  /** OB11 配置类型(由 schema 推导)。 */
695
726
  type OB11Config = z.infer<typeof ob11ConfigSchema>;
696
727
  //#endregion
697
- //#region src/onebot11/helper/data.d.ts
698
- /** canonical 元素数组 → OB11 segment 数组(无法表达的元素静默跳过)。 */
699
- declare function canonicalToSegments(elements: CanonicalElement[]): OB11MessageSegment[];
700
- /** OB11 segment 数组 → canonical 元素数组。 */
701
- declare function segmentsToCanonical(segments: OB11MessageSegment[]): CanonicalElement[];
702
- /** CQ 码字符串 → OB11 segment 数组(未知 CQ 类型保留为 text 段原文)。 */
703
- declare function cqMessageToSegments(text: string): OB11MessageSegment[];
704
- /** canonical 元素数组 → CQ 码字符串。 */
705
- declare function canonicalToCqMessage(elements: CanonicalElement[]): string;
706
- /** CQ 码字符串 → canonical 元素数组。 */
707
- declare function cqMessageToCanonical(text: string): CanonicalElement[];
708
- //#endregion
709
728
  //#region src/onebot11/adapter.d.ts
710
729
  /** 最小 logger 面(校准日志用:未知事件形状打 raw JSON;缺省静默)。 */
711
730
  interface AdapterLoggerLike {
@@ -782,6 +801,7 @@ declare class NapukettoOneBot11Adapter extends BaseProtocolAdapter<OB11Config> {
782
801
  /**
783
802
  * 广播消息事件(P2-19:接收方向 ID 转换)。
784
803
  * 收集 at uid → 一次批量 uidToUin → 构造上下文 → 翻译广播。
804
+ * 群消息另查发送者角色(GroupCache 缓存优先,失败回退缺省 member)。
785
805
  * 翻译失败退化为原样(不阻塞上报)。
786
806
  */
787
807
  private broadcastMessageEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/onebot11/helper/message-unique.ts","../../src/onebot11/api/one-bot-api.ts","../../src/onebot11/action/error-map.ts","../../src/onebot11/action/group/get-group-at-all-remain.ts","../../src/onebot11/types/index.ts","../../src/onebot11/event/base.ts","../../src/onebot11/event/message.ts","../../src/onebot11/event/meta.ts","../../src/onebot11/event/notice.ts","../../src/onebot11/event/request.ts","../../src/onebot11/event/index.ts","../../src/onebot11/action/index.ts","../../src/onebot11/helper/codec/cqcode.ts","../../src/onebot11/helper/codec/segment.ts","../../src/onebot11/helper/config.ts","../../src/onebot11/helper/data.ts","../../src/onebot11/adapter.ts","../../src/onebot11/transport.ts"],"mappings":";;;;;;cAkBa;;mBAEQ;;mBAEA;;mBAEA;;UAET;;mBAES;;;;;EAMjB,MAAM,eAAe,OAAO;;EAmB5B,SAAS;;EAKT,aAAa;;EAKb,QAAQ,gBAAgB;;EAKxB,QAAQ;;UAYA;;;;;UCvDK;;EAEb;;EAEA,mBAAmB;;EAEnB;;EAEA;;EAEA,aAAa;;EAEb,gBAAgB;;;UAIH;EACb,QAAQ;EACR,UAAU;EACV,gBAAgB;EAChB,WAAW;EACX,WAAW;EACX,cAAc;EACd,YAAY;EACZ,gBAAgB;EAChB,QAAQ;;EAER;IAAQ;IAAa;;;EAErB,QAAQ;;EAER,aAAa;;;;;;cAOJ;;WAEA,QAAQ;;WAER,UAAU;;WAEV,gBAAgB;;WAEhB,WAAW;;WAEX,WAAW;;WAEX,cAAc;;WAEd,YAAY;;WAEZ,gBAAgB;;WAEhB,QAAQ;;WAER,YAAY;;WAEZ,eAAe;;WAEf;IAAQ;IAAa;;;WAErB;;WAEA;;WAEA,mBAAmB;;WAEnB;;WAEA;;WAEA,aAAa;;WAEb,gBAAgB;EAEzB,YAAY,MAAM;;EAuBlB,SAAS,iBAAiB,QAAQ;;EAKlC,SAAS,iBAAiB,QAAQ;;;;;cCzHzB,kBAAkB;;;;UCMd;EACb;EACA;EACA;;;;;;;;;UCba,WAAW;EACxB;EACA;EACA,MAAM;EACN;EACA;;;KAIQ;EACJ;EAAc;IAAQ;;;EACtB;EAAY;IAAQ;IAAY;;;EAChC;EAAc;IAAQ;;;EACtB;EAAe;IAAQ;IAAc;;;EACrC;EAAgB;IAAQ;IAAc;;;EACtC;EAAe;IAAQ;IAAc;;;EACrC;EAAc;IAAQ;;;EACtB;EAAe;IAAQ;;;EACvB;EAAiB;IAAQ;;;EACzB;EAAc;IAAQ;;;EACtB;EAAa;IAAQ;;;EACrB;EAAgB;IAAQ;;;;KAGpB,uBAAuB;;UAGlB;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;;;UAIa;EACb;EACA;EACA;EACA;IACI;IACA;IACA;IACA;;EAEJ;EACA,SAAS;EACT;EACA;EACA;;;KAIQ;;UAGK;EACb;EACA;EACA;EACA;EACA,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA;EACA,MAAM;EACN;;EAEA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA,oBAAoB;EACpB,gBAAgB;EAChB,gBAAgB;EAChB,aAAa;EACb,oBAAoB;EACpB,cAAc;;;UAID;EACb;EACA;EACA;;EAEA;EACA;EACA;EACA,eAAe;EACf,gBAAgB;EAChB;;;;;;;;;;;;KCtJQ;;UAGK;;EAEb;;EAEA;;EAEA,WAAW;;;;;UCPE;EACb;EACA;EACA;;;UAIa,oBAAoB;EACjC;EACA;;;UAIa,8BAA8B;EAC3C;EACA;;EAEA;EACA;EACA;EACA;EACA,SAAS;EACT;EACA;EACA,QAAQ;EACR,YAAY;;;UAIC,gCAAgC;EAC7C;EACA;;EAEA;EACA;EACA;EACA,SAAS;EACT;EACA;EACA,QAAQ;;EAER;;;KAIQ,mBAAmB,wBAAwB;;;;UC9CtC;EACb;EACA;GACC;;;UAIY,+BAA+B;EAC5C;EACA;EACA;;;UAIa,+BAA+B;EAC5C;EACA;;EAEA;EACA,QAAQ;;;KAIA,gBAAgB,yBAAyB;;;;UCvBpC;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA;EACA,MAAM;;;UAIO,kCAAkC;EAC/C;EACA;EACA;EACA;EACA;;;UAIa,qCAAqC;EAClD;EACA;EACA;EACA;EACA;EACA;;;UAIa,qCAAqC;EAClD;EACA;EACA;EACA;EACA;EACA;;;UAIa,gCAAgC;EAC7C;EACA;EACA;EACA;EACA;EACA;;EAEA;;;UAIa,iCAAiC;EAC9C;EACA;EACA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;;;UAIa,iCAAiC;EAC9C;EACA;EACA;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;EACA;EACA;EACA;;;UAIa,8BAA8B;EAC3C;EACA;EACA;EACA;EACA;EACA;;EAEA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA,MAAM;;;UAIO,iCAAiC;EAC9C;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;EACA;EACA,OAAO;;;UAIM,kCAAkC;EAC/C;EACA;EACA;EACA;EACA;;;KAIQ,kBACN,6BACA,4BACA,+BACA,+BACA,0BACA,2BACA,6BACA,8BACA,2BACA,8BACA,wBACA,6BACA,2BACA,8BACA;;;;UCpLW,+BAA+B;EAC5C;EACA;EACA;;EAEA;;EAEA;;;UAIa,8BAA8B;EAC3C;EACA;;EAEA;EACA;EACA;EACA;EACA;;;KAIQ,mBAAmB,yBAAyB;;;;KCiB5C,YAAY,mBAAoB,kBAAmB,mBAAoB;;;;UCyDlE;;EAEb,KAAK;;;iBAIO,yBAAyB,MAAM,iBAAiB;;;;;;;;;;;;;;UCjF/C;EACb;EACA,QAAQ;;;iBAII,aAAa;;iBAKb,cAAc;;iBAKd,eAAe;;iBASf,aACZ,cACA,QAAQ;;;;;;;;iBAqBI,eAAe,eAAe,eAAe;;iBAuB7C,iBAAiB,OAAO,eAAe;;;;iBC8GvC,oBAAoB,UAAU;;;;cCxJjC,kBAAgB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuB3B,EAAA,KAAA;;KAGU,aAAa,EAAE,aAAa;;;;iBC/DxB,oBAAoB,UAAU,qBAAqB;;iBAYnD,oBAAoB,UAAU,uBAAuB;;iBAoIrD,oBAAoB,eAAe;;iBAkBnC,qBAAqB,UAAU;;iBAK/B,qBAAqB,eAAe;;;;UCjHnC;EACb,KAAK,cAAc;EACnB,KAAK,cAAc;;EAEnB,MAAM,cAAc;;;UAIP,+BAA+B;;EAE5C,QAAQ,eAAe;;EAEvB,aAAa;;EAEb,YAAY;;EAEZ,eAAe;;EAEf,gBAAgB;;EAEhB,mBAAmB;;EAEnB,SAAS;;;cAIA,iCAAiC,oBAAoB;WACrD;mBAEQ;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;;WAER,UAAU;UACX;UACA;UACA;UACA;UACA;;UAEA;;UAEA;EAER,YAAY,MAAM;;;;;UAwBJ;;UAYA;;UAyCN;;UAiBM;;UAaN;;;;;;EAmJF,iBAAiB;;EAUvB;;;;;UASQ;;;;;;UA2CM;;UA2BA;;UAiBA;;UA4BA;;UAiBN;;;;;EAWF,cAAc,cAAc,UAAU,wBAAwB;;;;;UC/dvD;;EAEb,SAAS;;EAET,YAAY;;EAEZ,aAAa;;;UAIA;;EAEb,QAAQ;;EAER,aAAa;;EAEb,gBAAgB,cAAc,UAAU;;EAExC;;;iBAiBY,uBAAuB,MAAM,gCAAgC"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/onebot11/types/index.ts","../../src/onebot11/helper/data.ts","../../src/onebot11/helper/message-unique.ts","../../src/onebot11/api/one-bot-api.ts","../../src/onebot11/action/error-map.ts","../../src/onebot11/action/group/get-group-at-all-remain.ts","../../src/onebot11/event/base.ts","../../src/onebot11/event/message.ts","../../src/onebot11/event/meta.ts","../../src/onebot11/event/notice.ts","../../src/onebot11/event/request.ts","../../src/onebot11/event/index.ts","../../src/onebot11/action/index.ts","../../src/onebot11/helper/codec/cqcode.ts","../../src/onebot11/helper/codec/segment.ts","../../src/onebot11/helper/config.ts","../../src/onebot11/adapter.ts","../../src/onebot11/transport.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { i as BaseAction, o as ActionRegistry, r as BaseProtocolAdapter, t as ensureSilk } from "../core-of7sLiQX.mjs";
1
+ import { i as BaseAction, o as ActionRegistry, r as BaseProtocolAdapter, t as ensureSilk } from "../core-DyXyDUcU.mjs";
2
2
  import { n as createHttpServerSchema, r as createWsServerSchema, t as collectGrayTipUids } from "../gray-tip-B80z9KR4.mjs";
3
3
  import { t as forEachRawMessage } from "../raw-message-6KdlG8kR.mjs";
4
4
  import { ChatType, GrayTipSubType, GroupApi, GroupNotifyMsgStatus, GroupNotifyMsgType, NTGroupMemberRole, NTGroupRequestOperateTypes, TicketApi, TipGroupElementType, WebHonorType, kernelError, toCanonicalElements } from "@napuketto/kernel";
@@ -1901,7 +1901,7 @@ function toOb11MessageInfo(msg, unique, ctx = {}) {
1901
1901
  if (msg.chatType === ChatType.GROUP) {
1902
1902
  info.group_id = Number(msg.peerUid);
1903
1903
  const { sender } = info;
1904
- sender.role = "member";
1904
+ sender.role = ctx.senderRole ?? "member";
1905
1905
  if (msg.sendMemberName !== void 0) sender.card = msg.sendMemberName;
1906
1906
  } else info.user_id = Number(msg.senderUin);
1907
1907
  return info;
@@ -2258,6 +2258,7 @@ function resolveStartMsgId(messageSeq, messageUnique) {
2258
2258
  /**
2259
2259
  * 拉取历史消息并翻译为 OB11 消息信息数组。
2260
2260
  * 收集全部消息 at uid → 一次批量 uidToUin → 上下文注入(P2-19)。
2261
+ * 群聊另取发送者角色表(GroupCache 一次整表读取,失败回退缺省 member)。
2261
2262
  */
2262
2263
  async function fetchAndTranslateHistory(peer, messageSeq, count, deps) {
2263
2264
  const startMsgId = resolveStartMsgId(messageSeq, deps.messageUnique);
@@ -2278,7 +2279,15 @@ async function fetchAndTranslateHistory(peer, messageSeq, count, deps) {
2278
2279
  ...uidToUin !== void 0 ? { uidToUin } : {},
2279
2280
  msgIdToOb11Id: (m) => deps.messageUnique.getMessageId(m)
2280
2281
  };
2281
- return { messages: msgs.map((msg) => toOb11MessageInfo(msg, deps.messageUnique, ctx)) };
2282
+ let senderRoles;
2283
+ if (peer.chatType === ChatType.GROUP) senderRoles = await deps.groupMemberRoles(peer.peerUid);
2284
+ return { messages: msgs.map((msg) => {
2285
+ const role = senderRoles?.get(msg.senderUid);
2286
+ return toOb11MessageInfo(msg, deps.messageUnique, {
2287
+ ...ctx,
2288
+ ...role !== void 0 ? { senderRole: role } : {}
2289
+ });
2290
+ }) };
2282
2291
  }
2283
2292
  //#endregion
2284
2293
  //#region src/onebot11/action/message/get-friend-msg-history.ts
@@ -2508,8 +2517,10 @@ var GetMsgAction = class extends BaseAction {
2508
2517
  if (atUids.length > 0) try {
2509
2518
  uidToUin = await this.deps.uidToUin(atUids);
2510
2519
  } catch {}
2520
+ const senderRole = msg.chatType === ChatType.GROUP ? await this.deps.groupMemberRole(msg.peerUid, msg.senderUid) : void 0;
2511
2521
  const ctx = {
2512
2522
  ...uidToUin !== void 0 ? { uidToUin } : {},
2523
+ ...senderRole !== void 0 ? { senderRole } : {},
2513
2524
  msgIdToOb11Id: (m) => this.deps.messageUnique.getMessageId(m)
2514
2525
  };
2515
2526
  return toOb11MessageInfo(msg, this.deps.messageUnique, ctx);
@@ -3571,6 +3582,34 @@ var OneBotApi = class {
3571
3582
  uidToUin(uids) {
3572
3583
  return this.groupApi.uidToUin(uids);
3573
3584
  }
3585
+ /**
3586
+ * 群成员角色(GroupCache 缓存优先,缺失惰性回填;sender.role 判定用)。
3587
+ * 未装配缓存 / 成员不在群 / 查询失败 → undefined(调用方回退缺省 "member",
3588
+ * 不阻塞消息上报)。
3589
+ */
3590
+ async groupMemberRole(groupCode, uid) {
3591
+ if (this.groupCache === void 0) return;
3592
+ try {
3593
+ const member = await this.groupCache.getMember(groupCode, uid);
3594
+ return member === void 0 ? void 0 : GroupApi.roleToString(member.role);
3595
+ } catch {
3596
+ return;
3597
+ }
3598
+ }
3599
+ /**
3600
+ * 群成员角色表(历史消息批量用:一次整表读取,uid → role)。
3601
+ * 失败语义同 groupMemberRole。
3602
+ */
3603
+ async groupMemberRoles(groupCode) {
3604
+ if (this.groupCache === void 0) return;
3605
+ try {
3606
+ const out = /* @__PURE__ */ new Map();
3607
+ for (const member of await this.groupCache.getMembers(groupCode)) out.set(member.uid, GroupApi.roleToString(member.role));
3608
+ return out;
3609
+ } catch {
3610
+ return;
3611
+ }
3612
+ }
3574
3613
  };
3575
3614
  //#endregion
3576
3615
  //#region src/onebot11/helper/message-event.ts
@@ -3601,7 +3640,7 @@ function toOb11MessageEvent(msg, selfUin, unique, messageFormat = "array", ctx =
3601
3640
  const sender = {
3602
3641
  user_id: userId,
3603
3642
  nickname: msg.sendNickName,
3604
- role: "member"
3643
+ role: ctx.senderRole ?? "member"
3605
3644
  };
3606
3645
  if (msg.sendMemberName !== void 0) sender.card = msg.sendMemberName;
3607
3646
  return {
@@ -4345,6 +4384,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
4345
4384
  /**
4346
4385
  * 广播消息事件(P2-19:接收方向 ID 转换)。
4347
4386
  * 收集 at uid → 一次批量 uidToUin → 构造上下文 → 翻译广播。
4387
+ * 群消息另查发送者角色(GroupCache 缓存优先,失败回退缺省 member)。
4348
4388
  * 翻译失败退化为原样(不阻塞上报)。
4349
4389
  */
4350
4390
  async broadcastMessageEvent(msg) {
@@ -4353,8 +4393,10 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
4353
4393
  if (atUids.length > 0) try {
4354
4394
  uidToUin = await this.oneBotApi.uidToUin(atUids);
4355
4395
  } catch {}
4396
+ const senderRole = msg.chatType === ChatType.GROUP ? await this.oneBotApi.groupMemberRole(msg.peerUid, msg.senderUid) : void 0;
4356
4397
  const ctx = {
4357
4398
  ...uidToUin !== void 0 ? { uidToUin } : {},
4399
+ ...senderRole !== void 0 ? { senderRole } : {},
4358
4400
  msgIdToOb11Id: (msgId) => this.oneBotApi.messageUnique.getMessageId(msgId)
4359
4401
  };
4360
4402
  this.broadcastEvent(toOb11MessageEvent(msg, this.selfUin, this.oneBotApi.messageUnique, this.messageFormat, ctx));