@napuketto/adapter 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/kurobot/index.mjs +1 -1
- package/dist/milky/index.d.mts +187 -0
- package/dist/milky/index.d.mts.map +1 -0
- package/dist/milky/index.mjs +1240 -0
- package/dist/milky/index.mjs.map +1 -0
- package/dist/onebot11/index.d.mts.map +1 -1
- package/dist/onebot11/index.mjs +23 -20
- package/dist/onebot11/index.mjs.map +1 -1
- package/dist/raw-message-D_ecJy4C.mjs +19 -0
- package/dist/raw-message-D_ecJy4C.mjs.map +1 -0
- package/dist/satori/index.mjs +1 -1
- package/package.json +9 -4
- package/dist/raw-message-6KdlG8kR.mjs +0 -13
- package/dist/raw-message-6KdlG8kR.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["emptySchema"],"sources":["../../src/milky/helper/entities.ts","../../src/milky/helper/media-uri.ts","../../src/milky/helper/segments.ts","../../src/milky/helper/translate.ts","../../src/milky/action/error-map.ts","../../src/milky/action/base-action.ts","../../src/milky/action/message.ts","../../src/milky/action/social.ts","../../src/milky/action/system.ts","../../src/milky/action/index.ts","../../src/milky/api.ts","../../src/milky/helper/seq-index.ts","../../src/milky/transport.ts","../../src/milky/adapter.ts","../../src/milky/config.ts"],"sourcesContent":["/**\n * kernel 实体 → Milky 实体翻译(纯函数,ADR-008)\n *\n * Milky 事件/查询输出要求完整实体(GroupEntity/GroupMemberEntity/FriendEntity\n * 的全部字段 required);kernel 实体字段是超集的子集,缺失字段按最小合法值兜底\n * (0 / 空串 / unknown),实触样本到位后逐步补真实值。\n */\n\nimport type { Friend } from \"@napuketto/kernel\";\nimport { GroupApi, type GroupDetailInfo, type GroupMember } from \"@napuketto/kernel\";\nimport type { FriendEntity, GroupEntity, GroupMemberEntity } from \"../types.js\";\n\n/** GroupDetailInfo / Group → GroupEntity(detail 缺失时全兜底)。 */\nexport function toGroupEntity(detail: GroupDetailInfo | undefined, groupCode: string): GroupEntity {\n return {\n group_id: Number(groupCode),\n group_name: detail?.groupName ?? \"\",\n member_count: detail?.memberNum ?? 0,\n max_member_count: detail?.maxMemberNum ?? 0,\n remark: detail?.remarkName ?? \"\",\n created_time: detail?.groupCreateTime ?? 0,\n description: \"\",\n question: \"\",\n announcement: \"\",\n };\n}\n\n/** 群列表项(GroupCache Group)→ GroupEntity。 */\nexport function groupListToEntity(group: {\n groupCode: string;\n groupName: string;\n memberCount: number;\n maxMember: number;\n}): GroupEntity {\n return {\n group_id: Number(group.groupCode),\n group_name: group.groupName,\n member_count: group.memberCount,\n max_member_count: group.maxMember,\n remark: \"\",\n created_time: 0,\n description: \"\",\n question: \"\",\n announcement: \"\",\n };\n}\n\n/** GroupMember → GroupMemberEntity(member 缺失时按 uin 兜底最小实体)。 */\nexport function toGroupMemberEntity(\n member: GroupMember | undefined,\n groupCode: string,\n uin: string,\n): GroupMemberEntity {\n const shutUpSeconds = member?.shutUpTime ?? 0;\n return {\n user_id: Number(member?.uin !== undefined && member.uin !== \"\" ? member.uin : uin),\n nickname: member?.nick ?? \"\",\n sex: \"unknown\",\n group_id: Number(groupCode),\n card: member?.cardName ?? \"\",\n title: member?.memberSpecialTitle ?? \"\",\n level: 0,\n role: GroupApi.roleToString(member?.role ?? 2),\n join_time: Number(member?.joinTime) || 0,\n last_sent_time: Number(member?.lastSpeakTime) || 0,\n shut_up_end_time: shutUpSeconds > 0 ? Math.floor(Date.now() / 1000) + shutUpSeconds : null,\n };\n}\n\n/** Friend → FriendEntity(kernel 无 qid/分类挂载,按最小实体兜底)。 */\nexport function toFriendEntity(\n friend: Friend | undefined,\n uin: string,\n nick: string,\n): FriendEntity {\n return {\n user_id: Number(friend?.uin !== undefined && friend.uin !== \"\" ? friend.uin : uin),\n nickname: friend?.nickname ?? nick,\n sex: \"unknown\",\n qid: \"\",\n remark: friend?.remark ?? \"\",\n category: { category_id: 0, category_name: \"\" },\n };\n}\n","/**\n * 发送媒体 URI 解析(Milky OutgoingSegment uri → 本地路径)\n *\n * 规范支持 file:// / http(s):// / base64:// 三种(image/record/video 共用):\n * - file:// → 平台路径(segments.ts 的同步面已处理)\n * - base64:// → 解码落盘 cacheDir/milky/,file-type 探测扩展名后改名\n * - http(s):// → @napuketto/media downloadUrl 落盘 cacheDir/milky/\n * 未配置 mediaDir 时远程 URI 报错(不发静默空消息)。\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, rename, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { kernelError } from \"@napuketto/kernel\";\nimport { detectFileType, downloadUrl, inferExtension } from \"@napuketto/media\";\n\n/** 解析远程媒体 URI 为本地绝对路径(base64:// / http(s)://;file:// 走同步面)。 */\nexport async function resolveMediaUri(uri: string, mediaDir: string | undefined): Promise<string> {\n if (mediaDir === undefined || mediaDir === \"\") {\n throw kernelError(\n \"远程媒体发送需要配置 [accounts.milky] cacheDir(下载缓存目录)\",\n \"INVALID_PARAM\",\n );\n }\n if (uri.startsWith(\"base64://\")) {\n return await writeBase64(uri.slice(\"base64://\".length), mediaDir);\n }\n const dest = join(mediaDir, `${randomUUID()}${inferExtension(null, uri)}`);\n await downloadUrl(uri, dest);\n return dest;\n}\n\n/** base64 载荷 → 落盘(先写 .bin,探测到扩展名再改名)。 */\nasync function writeBase64(payload: string, mediaDir: string): Promise<string> {\n let bytes: Buffer;\n try {\n bytes = Buffer.from(payload, \"base64\");\n } catch {\n throw kernelError(\"base64:// 载荷解码失败\", \"INVALID_PARAM\");\n }\n if (bytes.length === 0) {\n throw kernelError(\"base64:// 载荷为空\", \"INVALID_PARAM\");\n }\n await mkdir(mediaDir, { recursive: true });\n const raw = join(mediaDir, `${randomUUID()}.bin`);\n await writeFile(raw, bytes);\n try {\n const { ext } = await detectFileType(raw);\n const final = join(mediaDir, `${randomUUID()}${ext}`);\n await rename(raw, final);\n return final;\n } catch {\n // 类型探测失败:保留 .bin(QQ 端按内容嗅探)\n return raw;\n }\n}\n","/**\n * Milky 消息段 ↔ canonical 元素转换(纯函数,ADR-008)\n *\n * 接收方向:canonical → IncomingSegment(规范 14 种中 P0 映射 12 种;\n * market_face / markdown 无 canonical 对应,unknown 一律跳过——规范兼容性\n * 要求「数组中未知项跳过」)。\n * 发送方向:OutgoingSegment → canonical(10 种中 P0 映射 9 种;forward 发送\n * 走专用内核链路,P0 显式报错不静默跳过)。\n */\nimport { fileURLToPath } from \"node:url\";\nimport type { CanonicalElement } from \"@napuketto/kernel\";\nimport { kernelError } from \"@napuketto/kernel\";\nimport type { IncomingSegment, OutgoingSegment } from \"../types.js\";\n\n/** reply 段回填元信息(广播/action 路径异步取得,翻译纯函数消费)。 */\nexport interface ReplyMeta {\n messageSeq: number;\n senderId: number;\n time: number;\n}\n\n/** 接收段转换上下文(enrichment 产物)。 */\nexport interface ReceiveSegmentContext {\n /** at uid → uin(mention.user_id 需要 uin;缺省不转换,转换失败跳过该段)。 */\n uidToUin?: Map<string, string>;\n /** reply NT msgId → 引用消息元信息(回填 message_seq/sender_id/time)。 */\n replyMeta?: Map<string, ReplyMeta>;\n}\n\n/** uin 字符串 → Milky user_id(非有限正数 = 转换失败)。 */\nfunction toUserId(uin: string): number | undefined {\n const n = Number(uin);\n return Number.isFinite(n) && n >= 10001 ? n : undefined;\n}\n\n/** canonical 元素 → IncomingSegment 列表(unknown / 转换失败段跳过)。 */\nexport function canonicalToIncomingSegments(\n elements: CanonicalElement[],\n ctx: ReceiveSegmentContext = {},\n): IncomingSegment[] {\n const out: IncomingSegment[] = [];\n for (const el of elements) {\n const seg = canonicalToIncomingSegment(el, ctx);\n if (seg !== null) {\n out.push(seg);\n }\n }\n return out;\n}\n\n/** canonical image → image 段(resource_id = 本地路径优先,url 兜底)。 */\nfunction imageToIncoming(el: Extract<CanonicalElement, { type: \"image\" }>): IncomingSegment {\n return {\n type: \"image\",\n data: {\n resource_id: el.path !== \"\" ? el.path : (el.url ?? \"\"),\n temp_url: el.url ?? \"\",\n width: el.size?.width ?? 0,\n height: el.size?.height ?? 0,\n summary: \"\",\n sub_type: \"normal\",\n },\n };\n}\n\n/** canonical voice → record 段。 */\nfunction voiceToIncoming(el: Extract<CanonicalElement, { type: \"voice\" }>): IncomingSegment {\n return {\n type: \"record\",\n data: {\n resource_id: el.path !== \"\" ? el.path : (el.url ?? \"\"),\n temp_url: el.url ?? \"\",\n duration: el.durationMs !== undefined ? Math.round(el.durationMs / 1000) : 0,\n },\n };\n}\n\n/** canonical video → video 段。 */\nfunction videoToIncoming(el: Extract<CanonicalElement, { type: \"video\" }>): IncomingSegment {\n return {\n type: \"video\",\n data: {\n resource_id: el.path !== \"\" ? el.path : (el.url ?? \"\"),\n temp_url: el.url ?? \"\",\n width: el.width ?? 0,\n height: el.height ?? 0,\n duration: el.durationSec ?? 0,\n },\n };\n}\n\n/** 按类型分发的段映射器表(键 = canonical type;缺项 = 跳过)。 */\nconst INCOMING_MAPPERS: Partial<\n Record<\n CanonicalElement[\"type\"],\n (el: never, ctx: ReceiveSegmentContext) => IncomingSegment | null\n >\n> = {\n text: (el: Extract<CanonicalElement, { type: \"text\" }>) => ({\n type: \"text\",\n data: { text: el.text },\n }),\n at: atToIncoming,\n face: (el: Extract<CanonicalElement, { type: \"face\" }>) => ({\n type: \"face\",\n data: { face_id: el.id, is_large: false },\n }),\n reply: replyToIncoming,\n image: imageToIncoming,\n voice: voiceToIncoming,\n video: videoToIncoming,\n file: fileToIncoming,\n forward: forwardToIncoming,\n json: (el: Extract<CanonicalElement, { type: \"json\" }>) => ({\n type: \"light_app\",\n data: { app_name: parseAppName(el.raw), json_payload: rawToPayload(el.raw) },\n }),\n xml: (el: Extract<CanonicalElement, { type: \"xml\" }>) => ({\n type: \"xml\",\n data: { service_id: 0, xml_payload: rawToPayload(el.raw) },\n }),\n};\n\nfunction canonicalToIncomingSegment(\n el: CanonicalElement,\n ctx: ReceiveSegmentContext,\n): IncomingSegment | null {\n const mapper = INCOMING_MAPPERS[el.type];\n // unknown / 未映射类型:跳过(规范兼容性要求)\n return mapper === undefined ? null : mapper(el as never, ctx);\n}\n\n/** canonical at → mention / mention_all(uid→uin 失败跳过该段)。 */\nfunction atToIncoming(\n el: Extract<CanonicalElement, { type: \"at\" }>,\n ctx: ReceiveSegmentContext,\n): IncomingSegment | null {\n if (el.target === \"all\") {\n return { type: \"mention_all\", data: {} };\n }\n const uin = ctx.uidToUin?.get(el.target) ?? el.target;\n const userId = toUserId(uin);\n if (userId === undefined) {\n return null;\n }\n return { type: \"mention\", data: { user_id: userId, name: el.display ?? \"\" } };\n}\n\n/** canonical reply → reply 段(引用元信息经 ctx 回填,未命中全 0 兜底)。 */\nfunction replyToIncoming(\n el: Extract<CanonicalElement, { type: \"reply\" }>,\n ctx: ReceiveSegmentContext,\n): IncomingSegment {\n const meta = ctx.replyMeta?.get(el.messageId);\n return {\n type: \"reply\",\n data: {\n message_seq: meta?.messageSeq ?? 0,\n sender_id: meta?.senderId ?? 0,\n sender_name: null,\n time: meta?.time ?? 0,\n segments: [],\n },\n };\n}\n\n/** canonical file → file 段。 */\nfunction fileToIncoming(el: Extract<CanonicalElement, { type: \"file\" }>): IncomingSegment {\n return {\n type: \"file\",\n data: {\n file_id: el.path,\n file_name: el.name ?? \"\",\n file_size: el.size ?? 0,\n },\n };\n}\n\n/** canonical forward → forward 段(title/preview/summary 无 canonical 来源,空兜底)。 */\nfunction forwardToIncoming(el: Extract<CanonicalElement, { type: \"forward\" }>): IncomingSegment {\n return {\n type: \"forward\",\n data: {\n forward_id: el.messageIds[0] ?? \"\",\n title: \"\",\n preview: [],\n summary: \"\",\n },\n };\n}\n\n/** json 载荷 → 小程序名(spec app_name:JSON 顶层 app 字段,取不到空串)。 */\nfunction parseAppName(raw: unknown): string {\n let obj: unknown = raw;\n if (typeof raw === \"string\") {\n try {\n obj = JSON.parse(raw);\n } catch {\n return \"\";\n }\n }\n if (typeof obj !== \"object\" || obj === null || !(\"app\" in obj)) {\n return \"\";\n }\n const app = (obj as Record<string, unknown>)[\"app\"];\n return typeof app === \"string\" ? app : \"\";\n}\n\n/** canonical json/xml raw → 字符串载荷(字符串原样,其余 JSON 序列化)。 */\nfunction rawToPayload(raw: unknown): string {\n if (typeof raw === \"string\") {\n return raw;\n }\n try {\n return JSON.stringify(raw) ?? \"\";\n } catch {\n return \"\";\n }\n}\n\n/**\n * OutgoingSegment 数组 → canonical 元素(同步映射;媒体 URI 解析与 at uin→uid\n * 由调用方在返回值上继续处理)。\n * forward 显式报错(发送走 kernel 专用链路,P1 接)。\n */\nexport function outgoingSegmentsToCanonical(segments: OutgoingSegment[]): {\n elements: CanonicalElement[];\n atUins: string[];\n replySeqs: number[];\n} {\n const elements: CanonicalElement[] = [];\n const atUins: string[] = [];\n const replySeqs: number[] = [];\n for (const seg of segments) {\n switch (seg.type) {\n case \"text\":\n elements.push({ type: \"text\", text: seg.data.text });\n break;\n case \"mention\": {\n const uin = String(seg.data.user_id);\n atUins.push(uin);\n elements.push({ type: \"at\", target: uin });\n break;\n }\n case \"mention_all\":\n elements.push({ type: \"at\", target: \"all\" });\n break;\n case \"face\":\n elements.push({ type: \"face\", id: seg.data.face_id });\n break;\n case \"reply\": {\n replySeqs.push(seg.data.message_seq);\n elements.push({ type: \"reply\", messageId: String(seg.data.message_seq) });\n break;\n }\n case \"image\":\n elements.push({ type: \"image\", path: resolveUriToPathPlaceholder(seg.data.uri) });\n break;\n case \"record\":\n elements.push({ type: \"voice\", path: resolveUriToPathPlaceholder(seg.data.uri) });\n break;\n case \"video\":\n elements.push({ type: \"video\", path: resolveUriToPathPlaceholder(seg.data.uri) });\n break;\n case \"light_app\":\n elements.push({ type: \"json\", raw: seg.data.json_payload });\n break;\n case \"forward\":\n throw kernelError(\"forward 段发送暂未支持(P1 接内核转发链路)\", \"INVALID_PARAM\");\n default:\n // 未知段:跳过(规范兼容性要求)\n break;\n }\n }\n return { elements, atUins, replySeqs };\n}\n\n/**\n * 媒体 URI → 本地路径(同步面:file:// / 裸路径直接给 canonical;base64:// 与\n * http(s):// 需要异步落盘,由 send 核心在 canonical 上二次解析——此处先放原始\n * URI 作占位,send 核心按元素类型调用 resolveMediaUri 替换)。\n */\nfunction resolveUriToPathPlaceholder(uri: string): string {\n if (uri.startsWith(\"file://\")) {\n return fileUriToPath(uri);\n }\n if (uri.startsWith(\"http://\") || uri.startsWith(\"https://\") || uri.startsWith(\"base64://\")) {\n return uri;\n }\n // 裸路径(go-cqhttp 惯例):按本地路径处理\n return uri;\n}\n\n/** file:// 前缀(fileURLToPath 失败时的裸剥离兜底)。 */\nconst FILE_URI_PREFIX_RE = /^file:\\/\\//;\n\n/** file:// URI → 平台路径(Windows 盘符兼容)。 */\nfunction fileUriToPath(uri: string): string {\n try {\n return fileURLToPath(uri);\n } catch {\n return uri.replace(FILE_URI_PREFIX_RE, \"\");\n }\n}\n","/**\n * Milky 事件翻译(RawMessage → Milky 事件,纯函数,ADR-008)\n *\n * P0 事件两种:message_receive(onRecvMsg)/ message_recall(grayTip REVOKE)。\n * 实体与 reply 回填在广播路径异步取得后经 ctx 注入(翻译保持纯函数);\n * 撤回事件的 sender_id 取 RawMessage.senderUin(grayTip 系统消息的 sender\n * 即被撤回原消息的发送者,口径待真实事件校准)。\n */\nimport {\n type CanonicalElement,\n ChatType,\n type RawMessage,\n toCanonicalElements,\n} from \"@napuketto/kernel\";\nimport type {\n GroupEntity,\n GroupMemberEntity,\n IncomingMessage,\n MessageRecallData,\n MilkyEvent,\n} from \"../types.js\";\nimport { toFriendEntity, toGroupEntity, toGroupMemberEntity } from \"./entities.js\";\nimport { canonicalToIncomingSegments, type ReceiveSegmentContext } from \"./segments.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/** 接收事件翻译上下文。 */\nexport interface ReceiveTranslateContext extends ReceiveSegmentContext {\n /** 登录 uin(self_id)。 */\n selfUin: string;\n /** friend 场景:好友实体(广播路径 best-effort 构造;缺省最小实体)。 */\n friendEntity?: import(\"../types.js\").FriendEntity;\n /** group 场景:群实体(缺省最小实体)。 */\n groupEntity?: GroupEntity;\n /** group 场景:群成员实体(缺省最小实体)。 */\n groupMemberEntity?: GroupMemberEntity;\n}\n\n/** chatType → message_scene。 */\nexport function chatTypeToScene(chatType: number): \"friend\" | \"group\" | \"temp\" {\n if (chatType === ChatType.GROUP) {\n return \"group\";\n }\n if (chatType === ChatType.C2C_TEMP) {\n return \"temp\";\n }\n return \"friend\";\n}\n\n/** peer_id:群聊 = 群号(peerUid);好友/临时 = 对端 uin(peerUin,空退 peerUid)。 */\nfunction peerIdOf(msg: RawMessage, scene: \"friend\" | \"group\" | \"temp\"): number {\n const raw = scene === \"group\" ? msg.peerUid : msg.peerUin !== \"\" ? msg.peerUin : msg.peerUid;\n return Number(raw);\n}\n\n/** RawMessage → message_receive 事件(实体缺省最小合法值,schema 形状完整)。 */\nexport function toMessageReceiveEvent(\n msg: RawMessage,\n ctx: ReceiveTranslateContext,\n): MilkyEvent<IncomingMessage> {\n const elements: CanonicalElement[] = toCanonicalElements(msg);\n const segments = canonicalToIncomingSegments(elements, {\n ...(ctx.uidToUin !== undefined ? { uidToUin: ctx.uidToUin } : {}),\n ...(ctx.replyMeta !== undefined ? { replyMeta: ctx.replyMeta } : {}),\n });\n const scene = chatTypeToScene(msg.chatType);\n const time = Math.floor(Number(msg.msgTime) / MS_TO_SEC);\n let data: IncomingMessage;\n if (scene === \"group\") {\n data = {\n message_scene: \"group\",\n peer_id: peerIdOf(msg, scene),\n message_seq: Number(msg.msgSeq),\n sender_id: Number(msg.senderUin),\n time,\n segments,\n group: ctx.groupEntity ?? toGroupEntity(undefined, msg.peerUid),\n group_member:\n ctx.groupMemberEntity ?? toGroupMemberEntity(undefined, msg.peerUid, msg.senderUin),\n };\n } else if (scene === \"friend\") {\n data = {\n message_scene: \"friend\",\n peer_id: peerIdOf(msg, scene),\n message_seq: Number(msg.msgSeq),\n sender_id: Number(msg.senderUin),\n time,\n segments,\n friend:\n ctx.friendEntity ??\n toFriendEntity(\n undefined,\n msg.peerUin !== \"\" ? msg.peerUin : msg.senderUin,\n msg.peerName,\n ),\n };\n } else {\n data = {\n message_scene: \"temp\",\n peer_id: peerIdOf(msg, scene),\n message_seq: Number(msg.msgSeq),\n sender_id: Number(msg.senderUin),\n time,\n segments,\n group: ctx.groupEntity ?? null,\n };\n }\n return {\n time,\n self_id: Number(ctx.selfUin),\n event_type: \"message_receive\",\n data,\n };\n}\n\n/** 撤回 grayTip → message_recall 事件(非撤回 grayTip 返回 null)。 */\nexport function toMessageRecallEvent(\n msg: RawMessage,\n ctx: { selfUin: string; uidToUin?: Map<string, string> },\n): MilkyEvent<MessageRecallData> | null {\n const gray = msg.elements.find((el) => el.grayTipElement !== undefined)?.grayTipElement;\n const revoke = gray?.revokeElement;\n if (revoke === undefined) {\n return null;\n }\n const scene = chatTypeToScene(msg.chatType);\n const operatorUin = ctx.uidToUin?.get(revoke.operatorUid) ?? revoke.operatorUid;\n return {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n event_type: \"message_recall\",\n data: {\n message_scene: scene,\n peer_id: peerIdOf(msg, scene),\n message_seq: Number(msg.msgSeq),\n sender_id: Number(msg.senderUin),\n operator_id: Number(operatorUin) || 0,\n display_suffix: revoke.wording ?? \"\",\n },\n };\n}\n","/**\n * Milky 错误码映射(ADR-017:KernelErrorCode → 协议错误码,各协议自持)\n *\n * 规范语义:-400 = 参数解析失败、-403 = 未登录;其余业务错误为自定负数\n * (规范允许),取常见 HTTP 语义近似值便于应用端排查。\n */\nimport type { KernelErrorCode } from \"@napuketto/kernel\";\n\n/** KernelErrorCode → Milky retcode 映射表(-400/-403 规范语义,其余自定负数)。 */\nexport type MilkyErrorCodeMap = Record<KernelErrorCode, number>;\n\nexport const milkyErrorCodeMap: MilkyErrorCodeMap = {\n SEND_FAILED: -500,\n PERMISSION_DENIED: -405,\n NOT_FOUND: -404,\n TIMEOUT: -504,\n NOT_LOGIN: -403,\n INVALID_PARAM: -400,\n INVALID_STATE: -409,\n UNKNOWN: -500,\n};\n","/**\n * MilkyAction:Milky 动作基类(zod 校验 + KernelError → 负数 retcode)\n *\n * 与 OB11 BaseAction 分离的原因:Milky 响应信封无 echo、参数解析失败恒\n * retcode=-400(规范),不复用 OB11 的 400/1400 语义。\n * 响应信封由 transport 组装(status/retcode/data/message)。\n */\nimport { isKernelError } from \"@napuketto/kernel\";\nimport type { ZodType } from \"zod\";\nimport type { MilkyApi } from \"../api.js\";\nimport { type MilkyErrorCodeMap, milkyErrorCodeMap } from \"./error-map.js\";\n\n/** Milky 动作结果(retcode 为规范负数族;transport 原样组装信封)。 */\nexport interface MilkyActionResult<T> {\n status: \"ok\" | \"failed\";\n retcode: number;\n data: T | null;\n message: string;\n}\n\n/** zod 错误摘要(单行,issues 取前 3 条)。 */\nfunction zodSummary(error: { issues: Array<{ path: PropertyKey[]; message: string }> }): string {\n const parts: string[] = [];\n for (const issue of error.issues.slice(0, 3)) {\n parts.push(`${issue.path.map(String).join(\".\")}: ${issue.message}`);\n }\n return parts.join(\"; \");\n}\n\nexport abstract class MilkyAction<TPayload, TReturn> {\n abstract readonly name: string;\n abstract readonly schema: ZodType<TPayload>;\n protected abstract readonly errorCodeMap: MilkyErrorCodeMap;\n\n protected abstract _handle(payload: TPayload): Promise<TReturn>;\n\n /** 校验并执行(HTTP /api 入口;WS /event 不承载动作)。 */\n async handle(payload: unknown): Promise<MilkyActionResult<TReturn>> {\n const parsed = this.schema.safeParse(payload);\n if (!parsed.success) {\n return {\n status: \"failed\",\n retcode: -400,\n data: null,\n message: `参数解析失败: ${zodSummary(parsed.error)}`,\n };\n }\n try {\n return { status: \"ok\", retcode: 0, data: await this._handle(parsed.data), message: \"\" };\n } catch (err) {\n if (isKernelError(err)) {\n const retcode = this.errorCodeMap[err.code] ?? this.errorCodeMap.UNKNOWN;\n return { status: \"failed\", retcode, data: null, message: err.message };\n }\n return {\n status: \"failed\",\n retcode: this.errorCodeMap.UNKNOWN,\n data: null,\n message: err instanceof Error ? err.message : \"未知错误\",\n };\n }\n }\n}\n\n/**\n * 持 MilkyApi 的动作基类:api 注入 + 统一错误映射表(milkyErrorCodeMap)收拢,\n * 动作子类只写 name / schema / _handle。\n */\nexport abstract class MilkyApiAction<TPayload, TReturn> extends MilkyAction<TPayload, TReturn> {\n protected readonly errorCodeMap: MilkyErrorCodeMap = milkyErrorCodeMap;\n protected readonly api: MilkyApi;\n\n constructor(api: MilkyApi) {\n super();\n this.api = api;\n }\n}\n","/**\n * Milky 消息类动作(P0):send_private_message / send_group_message /\n * get_message / recall_private_message / recall_group_message\n *\n * 发送核心 sendMilkyMessage:OutgoingSegment → canonical(媒体 URI 异步落盘 +\n * at uin→uid + reply seq→msgId 原样兜底)→ MsgApi.sendMessage → 回查 msgSeq/time。\n * get/recall 入口是 message_seq(Milky ID 模型),经 seqIndex 反查 msgId。\n */\nimport type { CanonicalElement, Peer, RawMessage } from \"@napuketto/kernel\";\nimport { kernelError } from \"@napuketto/kernel\";\nimport { type ZodType, z } from \"zod\";\nimport type { MilkyApi } from \"../api.js\";\nimport { toGroupEntity, toGroupMemberEntity } from \"../helper/entities.js\";\nimport { resolveMediaUri } from \"../helper/media-uri.js\";\nimport { outgoingSegmentsToCanonical } from \"../helper/segments.js\";\nimport { type ReceiveTranslateContext, toMessageReceiveEvent } from \"../helper/translate.js\";\nimport type {\n GetMessageOutput,\n IncomingMessage,\n MessageScene,\n OutgoingSegment,\n SendMessageOutput,\n} from \"../types.js\";\nimport { MilkyApiAction } from \"./base-action.js\";\n\n/**\n * OutgoingSegment 宽松校验:入口只保证「{type, data}」形状,字段级转换在\n * outgoingSegmentsToCanonical 内做(未知段跳过 = 规范兼容性要求)。\n */\nconst outgoingSegmentSchema = z\n .object({ type: z.string(), data: z.record(z.string(), z.unknown()) })\n .loose() as unknown as ZodType<OutgoingSegment>;\n\nconst sendMessageFields = { message: z.array(outgoingSegmentSchema).min(1) } as const;\nconst recallFields = { message_seq: z.number().int().min(0) } as const;\n\n/** send_private_message:发送私聊消息。 */\nexport class SendPrivateMessageAction extends MilkyApiAction<\n { user_id: number; message: OutgoingSegment[] },\n SendMessageOutput\n> {\n readonly name = \"send_private_message\";\n readonly schema = z.object({ user_id: z.number().int().min(10001), ...sendMessageFields });\n\n protected async _handle(payload: {\n user_id: number;\n message: OutgoingSegment[];\n }): Promise<SendMessageOutput> {\n const peer = await this.api.resolvePeer(\"friend\", payload.user_id);\n return await sendMilkyMessage(peer, payload.message, this.api);\n }\n}\n\n/** send_group_message:发送群聊消息。 */\nexport class SendGroupMessageAction extends MilkyApiAction<\n { group_id: number; message: OutgoingSegment[] },\n SendMessageOutput\n> {\n readonly name = \"send_group_message\";\n readonly schema = z.object({ group_id: z.number().int().min(10001), ...sendMessageFields });\n\n protected async _handle(payload: {\n group_id: number;\n message: OutgoingSegment[];\n }): Promise<SendMessageOutput> {\n const peer = await this.api.resolvePeer(\"group\", payload.group_id);\n return await sendMilkyMessage(peer, payload.message, this.api);\n }\n}\n\n/** get_message:获取单条消息(seq → msgId 反查 + 实体回填)。 */\nexport class GetMessageAction extends MilkyApiAction<\n { message_scene: MessageScene; peer_id: number; message_seq: number },\n GetMessageOutput\n> {\n readonly name = \"get_message\";\n readonly schema = z.object({\n message_scene: z.enum([\"friend\", \"group\", \"temp\"]),\n peer_id: z.number().int().min(10001),\n message_seq: z.number().int().min(0),\n });\n\n protected async _handle(payload: {\n message_scene: MessageScene;\n peer_id: number;\n message_seq: number;\n }): Promise<GetMessageOutput> {\n const peer = await this.api.resolvePeer(payload.message_scene, payload.peer_id);\n const msgId = await this.api.resolveMsgIdBySeq(peer, payload.message_seq, peer.chatType);\n if (msgId === undefined) {\n throw kernelError(`消息 ${payload.message_seq} 不存在`, \"NOT_FOUND\");\n }\n const [msg] = await this.api.msgApi.fetchMsgsByMsgId(peer, [msgId]);\n if (msg === undefined) {\n throw kernelError(`消息 ${payload.message_seq} 不存在`, \"NOT_FOUND\");\n }\n return { message: await this.translateWithEntities(payload.message_scene, peer, msg) };\n }\n\n /** 实体回填(group 场景 schema 要求完整实体)→ IncomingMessage。 */\n private async translateWithEntities(\n scene: MessageScene,\n peer: Peer,\n msg: RawMessage,\n ): Promise<IncomingMessage> {\n const ctx: ReceiveTranslateContext = { selfUin: this.api.self.uin };\n if (scene === \"group\") {\n const [detail, member] = await Promise.all([\n this.api.groupCache?.getGroupDetail(peer.peerUid).catch(() => undefined),\n this.api.groupCache?.getMember(peer.peerUid, msg.senderUid).catch(() => undefined),\n ]);\n ctx.groupEntity = toGroupEntity(detail, peer.peerUid);\n ctx.groupMemberEntity = toGroupMemberEntity(member, peer.peerUid, msg.senderUin);\n }\n return toMessageReceiveEvent(msg, ctx).data;\n }\n}\n\n/** recall_private_message:撤回私聊消息。 */\nexport class RecallPrivateMessageAction extends MilkyApiAction<\n { user_id: number; message_seq: number },\n Record<string, never>\n> {\n readonly name = \"recall_private_message\";\n readonly schema = z.object({ user_id: z.number().int().min(10001), ...recallFields });\n\n protected async _handle(payload: {\n user_id: number;\n message_seq: number;\n }): Promise<Record<string, never>> {\n const peer = await this.api.resolvePeer(\"friend\", payload.user_id);\n await recallBySeq(peer, payload.message_seq, this.api);\n return {};\n }\n}\n\n/** recall_group_message:撤回群消息。 */\nexport class RecallGroupMessageAction extends MilkyApiAction<\n { group_id: number; message_seq: number },\n Record<string, never>\n> {\n readonly name = \"recall_group_message\";\n readonly schema = z.object({ group_id: z.number().int().min(10001), ...recallFields });\n\n protected async _handle(payload: {\n group_id: number;\n message_seq: number;\n }): Promise<Record<string, never>> {\n const peer = await this.api.resolvePeer(\"group\", payload.group_id);\n await recallBySeq(peer, payload.message_seq, this.api);\n return {};\n }\n}\n\n/** seq → msgId(反查)→ recallMessage。 */\nasync function recallBySeq(peer: Peer, seq: number, api: MilkyApi): Promise<void> {\n const msgId = await api.resolveMsgIdBySeq(peer, seq, peer.chatType);\n if (msgId === undefined) {\n throw kernelError(`消息 ${seq} 不存在`, \"NOT_FOUND\");\n }\n await api.msgApi.recallMessage(peer, [msgId]);\n}\n\n/** 发送核心:segments → canonical(URI/ID 转换)→ sendMessage → 回查输出。 */\nexport async function sendMilkyMessage(\n peer: Peer,\n segments: OutgoingSegment[],\n api: MilkyApi,\n): Promise<SendMessageOutput> {\n const { elements, atUins } = outgoingSegmentsToCanonical(segments);\n const resolved = await resolveElements(elements, atUins, api);\n if (resolved.length === 0) {\n throw kernelError(\"消息内容为空(全部消息段不可用)\", \"INVALID_PARAM\");\n }\n const { msgId } = await api.msgApi.sendMessage(peer, resolved);\n return await api.resolveSentOutput(peer, msgId);\n}\n\n/** 元素二次解析:at uin→uid + 远程媒体 URI 落盘(reply seq 已在映射层兜底原样)。 */\nasync function resolveElements(\n elements: CanonicalElement[],\n atUins: string[],\n api: MilkyApi,\n): Promise<CanonicalElement[]> {\n const uinToUid = await resolveAtUins(atUins, api);\n const out: CanonicalElement[] = [];\n for (const el of elements) {\n out.push(await resolveElement(el, uinToUid, api));\n }\n return out;\n}\n\n/** at uin→uid 批量转换(失败返回 undefined:at 原样 uin,交 QQ 端判断)。 */\nasync function resolveAtUins(\n atUins: string[],\n api: MilkyApi,\n): Promise<Map<string, string> | undefined> {\n if (atUins.length === 0) {\n return undefined;\n }\n try {\n return await api.uinToUid(atUins);\n } catch {\n return undefined;\n }\n}\n\n/** 单元素解析:at 目标替换 / 远程媒体 URI 落盘 / 其余原样。 */\nasync function resolveElement(\n el: CanonicalElement,\n uinToUid: Map<string, string> | undefined,\n api: MilkyApi,\n): Promise<CanonicalElement> {\n if (el.type === \"at\" && el.target !== \"all\") {\n return { ...el, target: uinToUid?.get(el.target) ?? el.target };\n }\n if (isRemoteMediaUri(el)) {\n const media = el as Extract<CanonicalElement, { type: \"image\" | \"voice\" | \"video\" }>;\n return { ...media, path: await resolveMediaUri(media.path, api.mediaDir) };\n }\n return el;\n}\n\n/** 远程媒体元素(image/voice/video 且 path 为需落盘的 URI)。 */\nfunction isRemoteMediaUri(el: CanonicalElement): boolean {\n return (\n (el.type === \"image\" || el.type === \"voice\" || el.type === \"video\") &&\n (el.path.startsWith(\"http://\") ||\n el.path.startsWith(\"https://\") ||\n el.path.startsWith(\"base64://\"))\n );\n}\n","/**\n * Milky 社交类动作(P0):get_friend_list / get_group_list\n */\nimport { z } from \"zod\";\nimport { groupListToEntity, toFriendEntity } from \"../helper/entities.js\";\nimport type { GetFriendListOutput, GetGroupListOutput } from \"../types.js\";\nimport { MilkyApiAction } from \"./base-action.js\";\n\nconst emptySchema = z.object({}).strict();\n\n/** get_friend_list:获取好友列表。 */\nexport class GetFriendListAction extends MilkyApiAction<\n Record<string, never>,\n GetFriendListOutput\n> {\n readonly name = \"get_friend_list\";\n readonly schema = emptySchema;\n\n protected async _handle(): Promise<GetFriendListOutput> {\n const friends = await this.api.friendApi.getFriendList();\n return {\n friends: friends.map((f) => toFriendEntity(f, f.uin, f.nickname)),\n };\n }\n}\n\n/**\n * get_group_list:获取群列表。\n * 实测校准(2026-08-08,OB11 同款):原生 getGroupList 返回值无数据,列表经\n * onGroupListUpdate 事件进 GroupCache——缓存优先,为空触发刷新回填。\n */\nexport class GetGroupListAction extends MilkyApiAction<Record<string, never>, GetGroupListOutput> {\n readonly name = \"get_group_list\";\n readonly schema = emptySchema;\n\n protected async _handle(): Promise<GetGroupListOutput> {\n const groups =\n this.api.groupCache !== undefined\n ? await this.api.groupCache.listGroupsRefreshed()\n : await this.api.groupApi.getGroupList(true);\n return { groups: groups.map(groupListToEntity) };\n }\n}\n","/**\n * Milky 系统类动作(P0):get_login_info / get_impl_info\n *\n * get_impl_info 是 Milky 的版本协商面(规范 §compatibility):milky_version\n * 固定 \"1.3\"(目标协议版本 1.3.0),qq_protocol_type 固定 windows(自建宿主)。\n */\nimport { z } from \"zod\";\nimport type { GetImplInfoOutput, GetLoginInfoOutput } from \"../types.js\";\nimport { MilkyApiAction } from \"./base-action.js\";\n\n/** Milky 协议版本(docs/protocols/milky.md:目标 1.3.0)。 */\nconst MILKY_VERSION = \"1.3\";\n\nconst emptySchema = z.object({}).strict();\n\n/** get_login_info:获取登录信息。 */\nexport class GetLoginInfoAction extends MilkyApiAction<Record<string, never>, GetLoginInfoOutput> {\n readonly name = \"get_login_info\";\n readonly schema = emptySchema;\n\n protected async _handle(): Promise<GetLoginInfoOutput> {\n return { uin: Number(this.api.self.uin), nickname: this.api.self.nickname };\n }\n}\n\n/** get_impl_info:获取协议端信息(版本协商)。 */\nexport class GetImplInfoAction extends MilkyApiAction<Record<string, never>, GetImplInfoOutput> {\n readonly name = \"get_impl_info\";\n readonly schema = emptySchema;\n\n protected async _handle(): Promise<GetImplInfoOutput> {\n return {\n impl_name: \"napukettoqq\",\n impl_version: this.api.implVersion,\n qq_protocol_version: this.api.qqVersion,\n qq_protocol_type: \"windows\",\n milky_version: MILKY_VERSION,\n };\n }\n}\n","/**\n * Milky 动作注册表(P0:9 个动作)\n *\n * P0 面 = docs/protocols/milky.md §9 P0 清单:get_login_info / get_impl_info /\n * send_private_message / send_group_message / get_message / recall_*_message /\n * get_friend_list / get_group_list。P1 扩面(群管/精华/群文件/好友请求/票据)\n * 往本注册表追加。\n */\nimport { ActionRegistry } from \"../../core/index.js\";\nimport type { MilkyApi } from \"../api.js\";\nimport type { MilkyAction } from \"./base-action.js\";\nimport {\n GetMessageAction,\n RecallGroupMessageAction,\n RecallPrivateMessageAction,\n SendGroupMessageAction,\n SendPrivateMessageAction,\n} from \"./message.js\";\nimport { GetFriendListAction, GetGroupListAction } from \"./social.js\";\nimport { GetImplInfoAction, GetLoginInfoAction } from \"./system.js\";\n\n/** Milky 动作注册表(P0 9 动作)。 */\nexport function createMilkyActionRegistry(opts: {\n api: MilkyApi;\n}): ActionRegistry<MilkyAction<unknown, unknown>> {\n const registry = new ActionRegistry<MilkyAction<unknown, unknown>>();\n const { api } = opts;\n registry.register(new GetLoginInfoAction(api));\n registry.register(new GetImplInfoAction(api));\n registry.register(new SendPrivateMessageAction(api));\n registry.register(new SendGroupMessageAction(api));\n registry.register(new GetMessageAction(api));\n registry.register(new RecallPrivateMessageAction(api));\n registry.register(new RecallGroupMessageAction(api));\n registry.register(new GetFriendListAction(api));\n registry.register(new GetGroupListAction(api));\n return registry;\n}\n","/**\n * MilkyApi:Milky 动作统一依赖聚合(对齐 OneBotApi 模式,P2-16)\n *\n * 持有 P0 动作面所需 kernel apis + 协议层共享状态(seq 双向映射 / 版本 /\n * 发送媒体缓存目录);动作经 Pick 视图取依赖,装配方只构造一次本对象。\n */\nimport type {\n FriendApi,\n GroupApi,\n GroupCache,\n MsgApi,\n Peer,\n ProfileApi,\n RawMessage,\n} from \"@napuketto/kernel\";\nimport { ChatType, kernelError } from \"@napuketto/kernel\";\nimport type { MessageSeqIndex } from \"./helper/seq-index.js\";\n\n/** MilkyApi 构造参数。 */\nexport interface MilkyApiOptions {\n msgApi: MsgApi;\n groupApi: GroupApi;\n friendApi: FriendApi;\n profileApi: ProfileApi;\n /** 登录身份(get_login_info / self_id 用)。 */\n self: { uin: string; nickname: string };\n /** 群/成员缓存(群实体回填 / get_group_list;未装配时动作直查 api)。 */\n groupCache?: GroupCache;\n /** QQ 客户端版本(get_impl_info.qq_protocol_version)。 */\n qqVersion: string;\n /** 协议端版本(get_impl_info.impl_version)。 */\n implVersion: string;\n /** 发送媒体 http(s)/base64 URI 下载缓存目录(缺省 = 远程媒体发送不可用)。 */\n mediaDir?: string;\n}\n\nexport class MilkyApi {\n readonly msgApi: MsgApi;\n readonly groupApi: GroupApi;\n readonly friendApi: FriendApi;\n readonly profileApi: ProfileApi;\n readonly self: { uin: string; nickname: string };\n readonly groupCache: GroupCache | undefined;\n readonly qqVersion: string;\n readonly implVersion: string;\n readonly mediaDir: string | undefined;\n /** message_seq ↔ msgId 双向映射(接收链路 record,动作侧反查)。 */\n readonly seqIndex: MessageSeqIndex;\n\n constructor(opts: MilkyApiOptions, seqIndex: MessageSeqIndex) {\n this.msgApi = opts.msgApi;\n this.groupApi = opts.groupApi;\n this.friendApi = opts.friendApi;\n this.profileApi = opts.profileApi;\n this.self = opts.self;\n this.groupCache = opts.groupCache;\n this.qqVersion = opts.qqVersion;\n this.implVersion = opts.implVersion;\n this.mediaDir = opts.mediaDir;\n this.seqIndex = seqIndex;\n }\n\n /** uin → uid(私聊目标 / at 段发送转换)。 */\n uinToUid(uins: string[]): Promise<Map<string, string>> {\n return this.groupApi.uinToUid(uins);\n }\n\n /** uid → uin(事件路径 mention 转换)。 */\n uidToUin(uids: string[]): Promise<Map<string, string>> {\n return this.groupApi.uidToUin(uids);\n }\n\n /**\n * message_scene + 数字 ID → NT Peer。\n * group = 群号直作 peerUid;friend/temp = uin → uid(失败退 uin 原样,交 QQ 端判断)。\n */\n async resolvePeer(scene: \"friend\" | \"group\" | \"temp\", id: number): Promise<Peer> {\n if (scene === \"group\") {\n return { chatType: ChatType.GROUP, peerUid: String(id) } satisfies Peer;\n }\n const uin = String(id);\n let uid: string | undefined;\n try {\n uid = (await this.uinToUid([uin])).get(uin);\n } catch {\n // 转换失败:退 uin 原样\n }\n return {\n chatType: scene === \"friend\" ? ChatType.C2C : ChatType.C2C_TEMP,\n peerUid: uid ?? uin,\n } satisfies Peer;\n }\n\n /**\n * seq → msgId(索引优先,未登记扫描近段历史兜底)。\n * 两层都未命中返回 undefined(调用方抛 NOT_FOUND)。\n */\n async resolveMsgIdBySeq(\n peer: Peer,\n seq: number,\n chatType: Peer[\"chatType\"],\n ): Promise<string | undefined> {\n const indexed = this.seqIndex.resolveMsgId(chatType, peer.peerUid, seq);\n if (indexed !== undefined) {\n return indexed;\n }\n const msgs = await this.msgApi.fetchMessages(peer, { count: 60 }).catch(() => []);\n const hit = msgs.find((m: RawMessage) => Number(m.msgSeq) === seq);\n if (hit === undefined) {\n return undefined;\n }\n this.seqIndex.record(hit);\n return hit.msgId;\n }\n\n /** 发送结果回查:msgId → {message_seq, time}(sendMessage 只回 msgId)。 */\n async resolveSentOutput(\n peer: Peer,\n msgId: string,\n ): Promise<{ message_seq: number; time: number }> {\n const [sent] = await this.msgApi.fetchMsgsByMsgId(peer, [msgId]);\n if (sent === undefined) {\n throw kernelError(\"发送结果回查失败(msgId 未命中)\", \"UNKNOWN\");\n }\n this.seqIndex.record(sent);\n return {\n message_seq: Number(sent.msgSeq),\n time: Math.floor(Number(sent.msgTime) / 1000),\n };\n }\n}\n","/**\n * MessageSeqIndex:message_seq ↔ msgId 双向映射(docs/protocols/milky.md §5 方案二)\n *\n * Milky 对外用会话内 message_seq(kernel RawMessage.msgSeq),NT 撤回/取消息入口\n * 是 msgId——两套 ID 空间都要用,这层跳不掉。接收链路 record(双向写入),\n * 动作侧 resolveMsgId 反查;反查不到由动作做历史扫描兜底(fetchMessages 近段匹配)。\n *\n * 容量封顶(FIFO 淘汰,Map 插入序 = 时间序):映射只服务近期消息操作\n * (撤回 2 分钟窗口 / get_message 最近引用),不做全量持久索引。\n */\nimport type { ChatType, RawMessage } from \"@napuketto/kernel\";\n\n/** 单方向最大条目数(测试用例引用容量语义)。 */\nexport const MAX_ENTRIES = 4096;\n\n/** msgId → seq 元信息(collectReplyMeta 回填用)。 */\ninterface SeqMeta {\n seq: number;\n senderUin: string;\n timeSec: number;\n}\n\nexport class MessageSeqIndex {\n /** `${chatType}:${peerUid}:${seq}` → msgId。 */\n private readonly seqToMsg = new Map<string, string>();\n /** msgId → seq 元信息。 */\n private readonly msgToMeta = new Map<string, SeqMeta>();\n\n /** 接收链路登记(一条消息双向写入;重复 msgId 覆盖)。 */\n record(msg: RawMessage): void {\n const seq = Number(msg.msgSeq);\n if (!Number.isFinite(seq) || seq < 0) {\n return;\n }\n this.seqToMsg.set(this.key(msg.chatType, msg.peerUid, seq), msg.msgId);\n this.msgToMeta.set(msg.msgId, {\n seq,\n senderUin: msg.senderUin,\n timeSec: Math.floor(Number(msg.msgTime) / 1000),\n });\n this.evict();\n }\n\n /** seq → msgId(反查;未登记返回 undefined)。 */\n resolveMsgId(chatType: ChatType, peerUid: string, seq: number): string | undefined {\n return this.seqToMsg.get(this.key(chatType, peerUid, seq));\n }\n\n /**\n * 批量回填 reply 引用元信息(msgId → Milky reply 段 data 所需三元组)。\n * 未命中的 id 不进表(翻译层按 0 兜底)。\n */\n collectReplyMeta(\n msgIds: string[],\n ): Map<string, { messageSeq: number; senderId: number; time: number }> {\n const out = new Map<string, { messageSeq: number; senderId: number; time: number }>();\n for (const id of msgIds) {\n const m = this.msgToMeta.get(id);\n if (m !== undefined) {\n out.set(id, {\n messageSeq: m.seq,\n senderId: Number(m.senderUin) || 0,\n time: m.timeSec,\n });\n }\n }\n return out;\n }\n\n /** key 规则(chatType 数值 + peerUid + seq;peerUid 群聊=群号,C2C=uid)。 */\n private key(chatType: ChatType, peerUid: string, seq: number): string {\n return `${chatType}:${peerUid}:${seq}`;\n }\n\n /** FIFO 淘汰到容量上限内。 */\n private evict(): void {\n while (this.seqToMsg.size > MAX_ENTRIES) {\n const oldest = this.seqToMsg.keys().next().value;\n if (oldest === undefined) {\n break;\n }\n this.seqToMsg.delete(oldest);\n }\n while (this.msgToMeta.size > MAX_ENTRIES) {\n const oldest = this.msgToMeta.keys().next().value;\n if (oldest === undefined) {\n break;\n }\n this.msgToMeta.delete(oldest);\n }\n }\n}\n","/**\n * Milky 传输装配(单端口 HTTP:POST /api/:api + GET /event SSE + /event WS 升级\n * + WebHook 主动推送,docs/protocols/milky.md §4)\n *\n * - HTTP API:HttpServer onPathRequest 分发 → 动作注册表 → 规范响应信封\n * (200 ok / 200 failed(-400/-403/自定) / 401 鉴权 / 404 API 不存在(空 body)/\n * 415 Content-Type)。\n * - /event:onRawRequest 承接 SSE(createSseResponse,event: milky_event);\n * onUpgrade 承接同端口 WS 升级(网络原语 2026-10-28 下沉 network)。\n * - WebHook:HttpClient(fire-and-forget POST,Authorization 头带 token)。\n *\n * 事件推送统一经 MilkyEventHub(注册到 EventBroadcaster,send → SSE/WS 客户端)。\n */\nimport type {\n AuthorizeHook,\n EventBroadcaster,\n HttpRouteContext,\n RequestContext,\n Respond,\n TransportAdapter,\n} from \"@napuketto/network\";\nimport { createSseResponse, HttpClient, HttpServer } from \"@napuketto/network\";\nimport { WebSocket } from \"ws\";\nimport type { ActionRegistry } from \"../core/index.js\";\nimport type { MilkyAction } from \"./action/base-action.js\";\nimport type { MilkyConfig } from \"./config.js\";\n\n/** /event 路径(规范固定)。 */\nconst EVENT_PATH = \"/event\";\n/** /api/ 前缀 + 动作名(小写字母开头,小写/数字/下划线)。 */\nconst API_PATH_RE = /^\\/api\\/([a-z][a-z0-9_]*)$/;\n/** Bearer 前缀。 */\nconst BEARER_PREFIX = \"Bearer \";\n\n/** 校准 logger 最小面(webhook 失败 / 配置异常提示;缺省静默)。 */\nexport interface MilkyLoggerLike {\n warn(obj: unknown, msg?: string): void;\n info(obj: unknown, msg?: string): void;\n}\n\n/** 传输装配结果。 */\nexport interface MilkyTransportSet {\n /** 已注册 broadcaster 的传输(HTTP server + webhook clients + 事件枢纽)。 */\n adapters: TransportAdapter[];\n /** 停止:关闭传输 + 注销广播(幂等)。 */\n close: () => Promise<void>;\n}\n\n/**\n * Milky 事件枢纽:SSE 客户端 + WS 客户端集合,send 即广播。\n * 传输适配器面(open/close/send,EventBroadcaster 多态派发)——生命周期随\n * HttpServer。连接注册经 attachTo 挂到 HttpServer 注入点(本类内部闭环);\n * WS 入帧忽略(规范:/event 为纯事件推送通道)。\n */\nclass MilkyEventHub implements TransportAdapter {\n private readonly sseClients = new Set<SseClientHandle>();\n private readonly sockets = new Set<WebSocket>();\n\n /** 把 /event 的 SSE(onRawRequest)与 WS 升级(onUpgrade)挂到 HTTP server。 */\n attachTo(server: HttpServer, config: MilkyConfig): void {\n server.onRawRequest = (ctx) => {\n if (ctx.path !== EVENT_PATH || ctx.method !== \"GET\") {\n return undefined;\n }\n if (!config.eventModes.includes(\"sse\")) {\n return new Response(\"event mode sse disabled\", { status: 404 });\n }\n return createSseResponse((client) => {\n this.sseClients.add(client);\n return () => {\n this.sseClients.delete(client);\n };\n });\n };\n server.onUpgrade = (req, accept, reject) => {\n if (pathnameOf(req.url) !== EVENT_PATH) {\n return;\n }\n if (!config.eventModes.includes(\"ws\")) {\n reject(404, \"event mode ws disabled\");\n return;\n }\n if (config.token !== \"\" && !tokenMatches(req, config.token)) {\n reject(401, \"unauthorized\");\n return;\n }\n accept((socket) => {\n this.sockets.add(socket);\n const remove = (): void => {\n this.sockets.delete(socket);\n };\n socket.on(\"close\", remove);\n socket.on(\"error\", remove);\n });\n };\n }\n\n /** 广播事件(EventBroadcaster emit 入口)。 */\n send<T>(event: T): void {\n const json = JSON.stringify(event);\n for (const client of this.sseClients) {\n client.send(json, \"milky_event\");\n }\n for (const socket of this.sockets) {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(json);\n }\n }\n }\n\n open(): void {\n // 生命周期随 HttpServer\n }\n\n async close(): Promise<void> {\n for (const client of this.sseClients) {\n client.close();\n }\n this.sseClients.clear();\n for (const socket of this.sockets) {\n socket.close(1001, \"server shutdown\");\n }\n this.sockets.clear();\n }\n\n onRequest?: (req: unknown, respond: Respond) => void;\n}\n\n/** SSE 客户端句柄(network SseClient + 显式关闭)。 */\ninterface SseClientHandle {\n send(data: string, event?: string): void;\n close(): void;\n}\n\n/** 按配置装配 Milky 传输。 */\nexport function assembleMilkyTransports(opts: {\n config: MilkyConfig;\n broadcaster: EventBroadcaster;\n registry: ActionRegistry<MilkyAction<unknown, unknown>>;\n logger?: MilkyLoggerLike;\n}): MilkyTransportSet {\n const { config, broadcaster, registry, logger } = opts;\n const hub = new MilkyEventHub();\n const token = config.token;\n const authorize = token !== \"\" ? makeMilkyAuthorize(token) : undefined;\n\n const server = new HttpServer({\n host: config.host,\n port: config.port,\n ...(authorize !== undefined ? { authorize } : {}),\n });\n hub.attachTo(server, config);\n server.onPathRequest = (ctx, req, respond) => {\n handleMilkyHttpRequest(ctx, req, respond, registry);\n };\n\n const adapters: TransportAdapter[] = [server, hub];\n for (const url of config.webhooks) {\n const client = new HttpClient({\n url,\n ...(token !== \"\" ? { headers: { authorization: `${BEARER_PREFIX}${token}` } } : {}),\n timeoutMs: 5000,\n onError: (err: unknown) => {\n logger?.warn({ url, err: String(err) }, \"milky: webhook 推送失败\");\n },\n });\n adapters.push(client);\n }\n\n for (const adapter of adapters) {\n broadcaster.register(adapter);\n }\n return {\n adapters,\n close: async () => {\n await server.close();\n await hub.close();\n for (const adapter of adapters) {\n broadcaster.unregister(adapter);\n }\n },\n };\n}\n\n/** HTTP /api 分发(规范信封 + 404/415 语义)。 */\nfunction handleMilkyHttpRequest(\n ctx: HttpRouteContext,\n req: unknown,\n respond: Respond,\n registry: ActionRegistry<MilkyAction<unknown, unknown>>,\n): void {\n if (ctx.method !== \"POST\") {\n respond(undefined, 404);\n return;\n }\n const match = API_PATH_RE.exec(ctx.path);\n if (match === null) {\n respond(undefined, 404);\n return;\n }\n const contentType = ctx.headers?.[\"content-type\"];\n if (contentType !== undefined && !contentType.toLowerCase().includes(\"application/json\")) {\n respond(undefined, 415);\n return;\n }\n const action = registry.get(match[1] ?? \"\");\n if (action === undefined) {\n // API 不存在:HTTP 404 + 空 body(规范)\n respond(undefined, 404);\n return;\n }\n action\n .handle(req)\n .then((result) => {\n if (result.status === \"ok\") {\n respond({ status: \"ok\", retcode: 0, data: result.data ?? {} });\n } else {\n respond({\n status: \"failed\",\n retcode: result.retcode,\n data: null,\n message: result.message,\n });\n }\n })\n .catch(() => {\n respond({ status: \"failed\", retcode: -500, data: null, message: \"internal error\" });\n });\n}\n\n/** 鉴权钩子:Bearer 头或 access_token 查询参数(规范允许 SSE/WS 查询参数兜底)。 */\nfunction makeMilkyAuthorize(token: string): AuthorizeHook {\n return (ctx) => tokenMatches(ctx, token);\n}\n\n/** 请求凭据匹配(头优先,查询参数兜底)。 */\nfunction tokenMatches(ctx: RequestContext, token: string): boolean {\n const auth = ctx.headers[\"authorization\"] ?? ctx.headers[\"Authorization\"];\n if (auth?.startsWith(BEARER_PREFIX)) {\n return auth.slice(BEARER_PREFIX.length) === token;\n }\n try {\n const url = new URL(ctx.url, \"http://localhost\");\n return url.searchParams.get(\"access_token\") === token;\n } catch {\n return false;\n }\n}\n\n/** URL 路径部分(无 scheme 相对 url 容错)。 */\nfunction pathnameOf(url: string): string {\n try {\n return new URL(url, \"http://localhost\").pathname;\n } catch {\n return url.split(\"?\")[0] ?? \"\";\n }\n}\n","/**\n * NapukettoMilkyAdapter:Milky 协议适配器(P0,docs/protocols/milky.md)\n *\n * 第四个协议适配器(与 OB11/Satori/KuroBot 并行):单端口 HTTP(/api + /event)\n * + WebHook。收链路订阅 kernel 消息通道 → 翻译 Milky 事件(message_receive /\n * message_recall)→ 广播;发链路 /api 动作 → kernel apis。\n *\n * 生命周期走 BaseProtocolAdapter 骨架;config.enabled=false 时空转(不订阅、\n * 不起传输)。翻译为纯函数(ADR-008):实体回填 / ID 转换在广播路径异步取得\n * 后经 ctx 注入。\n */\nimport type { CanonicalElement, MsgEventChannel, RawMessage } from \"@napuketto/kernel\";\nimport { ChatType, toCanonicalElements } from \"@napuketto/kernel\";\nimport type { EventBroadcaster } from \"@napuketto/network\";\nimport { BaseProtocolAdapter, type ProtocolConfig, type ProtocolHooks } from \"../core/index.js\";\nimport { subscribeRawMessages } from \"../core/raw-message.js\";\nimport { createMilkyActionRegistry } from \"./action/index.js\";\nimport { MilkyApi, type MilkyApiOptions } from \"./api.js\";\nimport type { MilkyConfig } from \"./config.js\";\nimport { toGroupEntity, toGroupMemberEntity } from \"./helper/entities.js\";\nimport { MessageSeqIndex } from \"./helper/seq-index.js\";\nimport {\n type ReceiveTranslateContext,\n toMessageRecallEvent,\n toMessageReceiveEvent,\n} from \"./helper/translate.js\";\nimport { assembleMilkyTransports, type MilkyLoggerLike } from \"./transport.js\";\n\n/** 适配器构造参数(api 相关字段继承 MilkyApiOptions)。 */\nexport interface MilkyAdapterOptions extends MilkyApiOptions {\n config: ProtocolConfig<MilkyConfig>;\n broadcaster: EventBroadcaster;\n /** kernel 消息事件通道(收链路入口)。 */\n msgChannel: MsgEventChannel;\n /** 校准日志(webhook 失败 / 启停提示;IPC 模式传 loader pino 实例)。 */\n logger?: MilkyLoggerLike;\n}\n\nexport class NapukettoMilkyAdapter extends BaseProtocolAdapter<MilkyConfig> {\n readonly protocol = \"milky\";\n\n private readonly msgChannel: MsgEventChannel;\n private readonly calibLogger: MilkyLoggerLike | undefined;\n private readonly api: MilkyApi;\n private readonly seqIndex = new MessageSeqIndex();\n /** 动作注册表(公共只读:装配方/测试枚举)。 */\n readonly registry: ReturnType<typeof createMilkyActionRegistry>;\n private unsubscribes: Array<() => void> = [];\n private stopTransports: (() => Promise<void>) | null = null;\n\n constructor(opts: MilkyAdapterOptions) {\n const hooks: ProtocolHooks = {\n onStart: (config) => this.startTransports(config as MilkyConfig),\n onStop: () => this.stopAll(),\n onReload: (config) => this.reloadTransports(config as MilkyConfig),\n };\n super({\n config: opts.config,\n broadcaster: opts.broadcaster,\n hooks,\n });\n this.msgChannel = opts.msgChannel;\n this.calibLogger = opts.logger;\n this.api = new MilkyApi(opts, this.seqIndex);\n this.registry = createMilkyActionRegistry({ api: this.api });\n }\n\n /** 启动传输 + 订阅(enabled=false 空转:不订阅不起传输)。 */\n private async startTransports(config: MilkyConfig): Promise<void> {\n if (!config.enabled) {\n this.calibLogger?.info({}, \"milky: 未启用(enabled=false),跳过装配\");\n return;\n }\n const broadcaster = this.getBroadcaster();\n if (broadcaster !== undefined) {\n const set = assembleMilkyTransports({\n config,\n broadcaster,\n registry: this.registry,\n ...(this.calibLogger !== undefined ? { logger: this.calibLogger } : {}),\n });\n this.stopTransports = set.close;\n }\n this.subscribe();\n this.calibLogger?.info(\n { host: config.host, port: config.port, modes: config.eventModes },\n \"milky: adapter started\",\n );\n }\n\n /** 热更新:停止重建(enabled 切换生效)。 */\n private async reloadTransports(config: MilkyConfig): Promise<void> {\n await this.stopAll();\n await this.startTransports(config);\n }\n\n /** 停止:退订 + 关传输。 */\n private async stopAll(): Promise<void> {\n this.unsubscribeAll();\n if (this.stopTransports !== null) {\n await this.stopTransports();\n this.stopTransports = null;\n }\n }\n\n /** 订阅 kernel 消息通道(幂等)。 */\n private subscribe(): void {\n if (this.unsubscribes.length > 0) {\n return;\n }\n this.unsubscribes.push(\n subscribeRawMessages(this.msgChannel, (msg) => {\n void this.handleIncoming(msg);\n }),\n );\n }\n\n /** 退订(幂等)。 */\n private unsubscribeAll(): void {\n for (const off of this.unsubscribes) {\n off();\n }\n this.unsubscribes = [];\n }\n\n /** 单条消息:seq 登记 → grayTip→recall / 普通→message_receive(自消息不上报)。 */\n private async handleIncoming(msg: RawMessage): Promise<void> {\n // seq 双向登记(含自消息:本账号发出的消息也要可反查)\n this.seqIndex.record(msg);\n if (hasGrayTip(msg)) {\n const event = await this.buildRecallEvent(msg);\n if (event !== null) {\n this.broadcastEvent(event);\n }\n return;\n }\n // 自消息不上报(P0 固定行为,与 OB11 默认一致)\n if (String(msg.senderUin) === this.api.self.uin) {\n return;\n }\n const event = await this.buildMessageReceiveEvent(msg);\n this.broadcastEvent(event);\n }\n\n /** message_receive 组装:at uid→uin + reply 回填 + 群实体回填(全部 fail-soft)。 */\n private async buildMessageReceiveEvent(msg: RawMessage): Promise<unknown> {\n const elements = toCanonicalElements(msg);\n const ctx: ReceiveTranslateContext = { selfUin: this.api.self.uin };\n await this.fillMentionUids(elements, ctx);\n this.fillReplyMeta(elements, ctx);\n await this.fillGroupEntities(msg, ctx);\n return toMessageReceiveEvent(msg, ctx);\n }\n\n /** at uid → uin 批量转换(mention.user_id 用;失败 mention 段跳过)。 */\n private async fillMentionUids(\n elements: CanonicalElement[],\n ctx: ReceiveTranslateContext,\n ): Promise<void> {\n const atUids = elements\n .filter((el) => el.type === \"at\" && el.target !== \"all\")\n .map((el) => (el as { target: string }).target);\n if (atUids.length === 0) {\n return;\n }\n try {\n ctx.uidToUin = await this.api.uidToUin(atUids);\n } catch {\n // 转换失败:mention 段跳过\n }\n }\n\n /** reply 引用元信息回填(seqIndex 命中即用;未命中不强查)。 */\n private fillReplyMeta(elements: CanonicalElement[], ctx: ReceiveTranslateContext): void {\n const replyIds = elements\n .filter((el) => el.type === \"reply\")\n .map((el) => (el as { messageId: string }).messageId);\n const meta = this.seqIndex.collectReplyMeta(replyIds);\n if (meta.size > 0) {\n ctx.replyMeta = meta;\n }\n }\n\n /** 群场景实体回填(GroupCache 缓存优先,失败最小实体兜底)。 */\n private async fillGroupEntities(msg: RawMessage, ctx: ReceiveTranslateContext): Promise<void> {\n if (msg.chatType !== ChatType.GROUP || this.api.groupCache === undefined) {\n return;\n }\n const [detail, member] = await Promise.all([\n this.api.groupCache.getGroupDetail(msg.peerUid).catch(() => undefined),\n this.api.groupCache.getMember(msg.peerUid, msg.senderUid).catch(() => undefined),\n ]);\n ctx.groupEntity = toGroupEntity(detail, msg.peerUid);\n ctx.groupMemberEntity = toGroupMemberEntity(member, msg.peerUid, msg.senderUin);\n }\n\n /** message_recall 组装(非撤回 grayTip 返回 null 静默)。 */\n private async buildRecallEvent(msg: RawMessage): Promise<unknown> {\n const uidToUin = await this.resolveOperatorUin(msg);\n return toMessageRecallEvent(msg, {\n selfUin: this.api.self.uin,\n ...(uidToUin !== undefined ? { uidToUin } : {}),\n });\n }\n\n /** 撤回操作者 uid → uin(未撤回/转换失败返回 undefined,operator_id 兜底 0)。 */\n private resolveOperatorUin(msg: RawMessage): Promise<Map<string, string> | undefined> {\n const operatorUid = findRevokeOperatorUid(msg);\n if (operatorUid === undefined) {\n return Promise.resolve(undefined);\n }\n return this.api.uidToUin([operatorUid]).catch(() => undefined);\n }\n}\n\n/** 撤回 grayTip 的操作者 uid(非撤回消息返回 undefined)。 */\nfunction findRevokeOperatorUid(msg: RawMessage): string | undefined {\n const uid = msg.elements.find((el) => el.grayTipElement?.revokeElement !== undefined)\n ?.grayTipElement?.revokeElement?.operatorUid;\n return uid === undefined || uid === \"\" ? undefined : uid;\n}\n\n/** 是否含 grayTip 元素(与 OB11 收链路同判据)。 */\nfunction hasGrayTip(msg: RawMessage): boolean {\n return msg.elements.some((el) => el.grayTipElement !== undefined);\n}\n","/**\n * Milky 协议配置(zod schema,归属本包,ADR-012)\n *\n * 单一 TOML 的 `[accounts.milky]` 账号段(docs/protocols/milky.md §4):\n * 单端口 HTTP 模型(/api + /event 同端口),`enabled` 缺省 false = 不启用。\n */\nimport { z } from \"zod\";\n\n/** Milky 配置 schema。 */\nexport const milkyConfigSchema = z.object({\n /** 启用开关(缺省 false:账号段存在但 enabled 未开 = 装配为空转)。 */\n enabled: z.boolean().default(false),\n /** HTTP 监听地址。 */\n host: z.string().min(1).default(\"127.0.0.1\"),\n /** HTTP 监听端口(/api 与 /event 同端口)。 */\n port: z.number().int().min(0).max(65535).default(3001),\n /** access_token(空 = 不校验,仅限内网)。 */\n token: z.string().default(\"\"),\n /** /event 允许的连接形态(缺省两者都开)。 */\n eventModes: z.array(z.enum([\"sse\", \"ws\"])).default([\"sse\", \"ws\"]),\n /** 额外事件推送地址(WebHook,可多个;协议端在请求头发 Bearer token)。 */\n webhooks: z.array(z.string().min(1)).default([]),\n /** 发送媒体 http(s) URI 下载缓存目录(缺省不下载 = http(s) 发送媒体不可用)。 */\n cacheDir: z.string().optional(),\n});\n\n/** Milky 配置类型(由 schema 推导)。 */\nexport type MilkyConfig = z.infer<typeof milkyConfigSchema>;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"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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"}
|
package/dist/onebot11/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
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
|
-
import {
|
|
3
|
+
import { n as subscribeRawMessages } from "../raw-message-D_ecJy4C.mjs";
|
|
4
4
|
import { ChatType, GrayTipSubType, GroupApi, GroupNotifyMsgStatus, GroupNotifyMsgType, NTGroupMemberRole, NTGroupRequestOperateTypes, TicketApi, TipGroupElementType, WebHonorType, kernelError, toCanonicalElements } from "@napuketto/kernel";
|
|
5
5
|
import { downloadUrl, inferExtension } from "@napuketto/media";
|
|
6
6
|
import { z } from "zod";
|
|
@@ -4269,22 +4269,20 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
4269
4269
|
/** 订阅 kernel 事件(消息 + 群通知 + 好友请求,幂等)。 */
|
|
4270
4270
|
subscribe() {
|
|
4271
4271
|
if (this.unsubscribes.length > 0) return;
|
|
4272
|
-
this.unsubscribes.push(this.msgChannel
|
|
4273
|
-
|
|
4274
|
-
|
|
4275
|
-
|
|
4272
|
+
this.unsubscribes.push(subscribeRawMessages(this.msgChannel, (msg) => {
|
|
4273
|
+
if (hasGrayTip(msg)) {
|
|
4274
|
+
this.broadcastNotice(msg).catch(() => {});
|
|
4275
|
+
return;
|
|
4276
|
+
}
|
|
4277
|
+
if (!this.reportSelfMessage && String(msg.senderUin) === this.selfUin) return;
|
|
4278
|
+
if (this.groupUploadAsNotice && msg.chatType === ChatType.GROUP && hasFileElement(msg)) {
|
|
4279
|
+
const notice = toGroupUpload(msg, this.selfUin);
|
|
4280
|
+
if (notice !== null) {
|
|
4281
|
+
this.broadcastEvent(notice);
|
|
4276
4282
|
return;
|
|
4277
4283
|
}
|
|
4278
|
-
|
|
4279
|
-
|
|
4280
|
-
const notice = toGroupUpload(msg, this.selfUin);
|
|
4281
|
-
if (notice !== null) {
|
|
4282
|
-
this.broadcastEvent(notice);
|
|
4283
|
-
return;
|
|
4284
|
-
}
|
|
4285
|
-
}
|
|
4286
|
-
this.broadcastMessageEvent(msg);
|
|
4287
|
-
});
|
|
4284
|
+
}
|
|
4285
|
+
this.broadcastMessageEvent(msg);
|
|
4288
4286
|
}));
|
|
4289
4287
|
this.unsubscribes.push(this.msgChannel.on("Msg/onRecvOfflineFileMsg", (arg) => {
|
|
4290
4288
|
const items = narrowOfflineFiles(arg);
|
|
@@ -4415,11 +4413,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
4415
4413
|
}
|
|
4416
4414
|
/** 广播群系统通知 → OB11 group request 事件(批量 uidToUin 后翻译,纯函数)。 */
|
|
4417
4415
|
async broadcastGroupRequests(notifies) {
|
|
4418
|
-
const uids =
|
|
4419
|
-
for (const n of notifies) {
|
|
4420
|
-
const notify = n;
|
|
4421
|
-
for (const u of [notify.user1, notify.user2]) if (typeof u?.uid === "string" && u.uid !== "") uids.push(u.uid);
|
|
4422
|
-
}
|
|
4416
|
+
const uids = collectGroupNotifyUids(notifies);
|
|
4423
4417
|
let uidToUin = /* @__PURE__ */ new Map();
|
|
4424
4418
|
if (uids.length > 0) try {
|
|
4425
4419
|
uidToUin = await this.oneBotApi.uidToUin(uids);
|
|
@@ -4486,6 +4480,15 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
4486
4480
|
respond(result);
|
|
4487
4481
|
}
|
|
4488
4482
|
};
|
|
4483
|
+
/** 收集群系统通知涉及的 uid(user1/user2 双方,空 uid 跳过)。 */
|
|
4484
|
+
function collectGroupNotifyUids(notifies) {
|
|
4485
|
+
const uids = [];
|
|
4486
|
+
for (const n of notifies) {
|
|
4487
|
+
const notify = n;
|
|
4488
|
+
for (const u of [notify.user1, notify.user2]) if (typeof u?.uid === "string" && u.uid !== "") uids.push(u.uid);
|
|
4489
|
+
}
|
|
4490
|
+
return uids;
|
|
4491
|
+
}
|
|
4489
4492
|
//#endregion
|
|
4490
4493
|
export { MessageUnique, NapukettoOneBot11Adapter, OneBotApi, assembleOb11Transports, canonicalToCqMessage, canonicalToSegments, cqMessageToCanonical, cqMessageToSegments, createOb11ActionRegistry, encodeCqCode, escapeCqParam, escapeCqText, ob11ConfigSchema, ob11ErrorCodeMap, parseCqMessage, segmentsToCanonical, segmentsToCqMessage, serializeCqParts, unescapeCqText };
|
|
4491
4494
|
|