@napuketto/adapter 0.4.0 → 0.4.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/dist/core/index.mjs +1 -1
- package/dist/{core-of7sLiQX.mjs → core-DyXyDUcU.mjs} +2 -2
- package/dist/{core-of7sLiQX.mjs.map → core-DyXyDUcU.mjs.map} +1 -1
- package/dist/index-CDKj-jus.d.mts.map +1 -1
- package/dist/kurobot/index.mjs +1 -1
- package/dist/onebot11/index.mjs +1 -1
- package/dist/satori/index.mjs +1 -1
- package/package.json +2 -2
package/dist/core/index.mjs
CHANGED
|
@@ -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-
|
|
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.
|
|
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-
|
|
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;;
|
|
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"}
|
package/dist/kurobot/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as BaseProtocolAdapter } from "../core-
|
|
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";
|
package/dist/onebot11/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as BaseAction, o as ActionRegistry, r as BaseProtocolAdapter, t as ensureSilk } from "../core-
|
|
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";
|
package/dist/satori/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as ActionRegistry, r as BaseProtocolAdapter, t as ensureSilk } from "../core-
|
|
1
|
+
import { 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, NTGroupRequestOperateTypes, TipGroupElementType, isKernelError, kernelError, toCanonicalElements } from "@napuketto/kernel";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@napuketto/adapter",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Protocol adapters (OneBot11 / Satori) for NapukettoQQ",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"directory": "packages/adapter"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@napuketto/kernel": "^0.
|
|
59
|
+
"@napuketto/kernel": "^0.4.0",
|
|
60
60
|
"@napuketto/media": "^0.0.7",
|
|
61
61
|
"@napuketto/network": "^0.0.3",
|
|
62
62
|
"ws": "^8.21.1",
|