@napuketto/adapter 0.8.3 → 0.9.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["DEFAULT_COUNT","DEFAULT_COUNT","DEFAULT_COUNT","MS_TO_SEC","MS_TO_SEC","toUin","MS_TO_SEC","DEFAULT_DOMAIN","STATUS_ONLINE","MS_TO_SEC","MS_TO_SEC"],"sources":["../../src/onebot11/action/error-map.ts","../../src/onebot11/action/resolve-uid.ts","../../src/onebot11/action/friend/delete-friend.ts","../../src/onebot11/action/friend/get-doubt-friends-add-request.ts","../../src/onebot11/action/friend/get-friend-list.ts","../../src/onebot11/action/friend/get-friends-with-category.ts","../../src/onebot11/action/friend/get-stranger-info.ts","../../src/onebot11/action/friend/send-like.ts","../../src/onebot11/action/friend/set-doubt-friends-add-request.ts","../../src/onebot11/action/friend/set-friend-add-request.ts","../../src/onebot11/action/friend/set-friend-remark.ts","../../src/onebot11/helper/message-unique.ts","../../src/onebot11/action/group/set-essence-msg.ts","../../src/onebot11/action/group/delete-essence-msg.ts","../../src/onebot11/action/group/get-essence-msg-list.ts","../../src/onebot11/action/group/get-group-add-request.ts","../../src/onebot11/action/group/get-group-at-all-remain.ts","../../src/onebot11/action/group/get-group-honor-info.ts","../../src/onebot11/helper/translate.ts","../../src/onebot11/action/group/get-group-info.ts","../../src/onebot11/action/group/get-group-list.ts","../../src/onebot11/action/group/get-group-member-info.ts","../../src/onebot11/action/group/get-group-member-list.ts","../../src/onebot11/action/group/get-group-shut-list.ts","../../src/onebot11/action/group/get-group-system-msg.ts","../../src/onebot11/action/group/group-files-op.ts","../../src/onebot11/action/group/group-files-query.ts","../../src/onebot11/action/group/set-group-add-request.ts","../../src/onebot11/action/group/set-group-admin.ts","../../src/onebot11/action/group/set-group-ban.ts","../../src/onebot11/action/group/set-group-card.ts","../../src/onebot11/action/group/set-group-kick.ts","../../src/onebot11/action/group/set-group-leave.ts","../../src/onebot11/action/group/set-group-name.ts","../../src/onebot11/action/group/set-group-whole-ban.ts","../../src/onebot11/action/message/delete-msg.ts","../../src/onebot11/action/message/fetch-ptt-text.ts","../../src/onebot11/action/message/resolve-peer.ts","../../src/onebot11/action/message/forward-single-msg.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/helper/message-info.ts","../../src/onebot11/helper/notice.ts","../../src/onebot11/helper/request.ts","../../src/onebot11/action/message/get-forward-msg.ts","../../src/onebot11/action/message/msg-history.ts","../../src/onebot11/action/message/get-friend-msg-history.ts","../../src/onebot11/action/message/get-group-msg-history.ts","../../src/onebot11/action/message/get-media.ts","../../src/onebot11/action/message/get-msg.ts","../../src/onebot11/action/message/mark-msg-as-read.ts","../../src/onebot11/action/message/mark-msg-as-read-aliases.ts","../../src/onebot11/action/message/send-forward-msg.ts","../../src/onebot11/action/message/send-msg.ts","../../src/onebot11/action/message/send-group-msg.ts","../../src/onebot11/action/message/send-private-msg.ts","../../src/onebot11/action/message/set-input-status.ts","../../src/onebot11/action/message/set-msg-emoji-like.ts","../../src/onebot11/action/system/can-send-image.ts","../../src/onebot11/action/system/can-send-record.ts","../../src/onebot11/action/system/clean-cache.ts","../../src/onebot11/action/system/download-file.ts","../../src/onebot11/action/system/get-clientkey.ts","../../src/onebot11/action/system/get-cookies.ts","../../src/onebot11/action/system/get-credentials.ts","../../src/onebot11/action/system/get-login-info.ts","../../src/onebot11/action/system/get-robot-uin-range.ts","../../src/onebot11/action/system/get-status.ts","../../src/onebot11/action/system/get-version-info.ts","../../src/onebot11/action/system/process-control.ts","../../src/onebot11/action/system/profile-actions.ts","../../src/onebot11/action/system/set-diy-online-status.ts","../../src/onebot11/action/system/set-online-status.ts","../../src/onebot11/action/system/translate-en2zh.ts","../../src/onebot11/action/index.ts","../../src/onebot11/api/one-bot-api.ts","../../src/onebot11/helper/message-event.ts","../../src/onebot11/helper/notice-extra.ts","../../src/onebot11/helper/sysmsg.ts","../../src/onebot11/transport.ts","../../src/onebot11/adapter.ts"],"sourcesContent":["/**\n * OB11 错误码映射表(ADR-017:协议层只维护映射,不解析逻辑)\n *\n * kernel 抛 KernelError(带 KernelErrorCode),各协议维护一份\n * KernelErrorCode → 协议错误码 的映射;BaseAction 统一做映射。\n */\n\nimport type { ErrorCodeMap } from \"../../core/index.js\";\n\n/** OB11 错误码映射表(send_msg 等所有 OB11 动作共用)。 */\nexport const ob11ErrorCodeMap: ErrorCodeMap = {\n SEND_FAILED: 100,\n PERMISSION_DENIED: 101,\n NOT_FOUND: 102,\n TIMEOUT: 103,\n NOT_LOGIN: 104,\n INVALID_PARAM: 105,\n INVALID_STATE: 106,\n UNKNOWN: 999,\n};\n","/**\n * OB11 用户 ID 解析(uin → uid,多个动作共用,2026-08-08 克隆合并)\n */\n\nimport { kernelError } from \"@napuketto/kernel\";\n\n/** 解析单个 uin → uid(失败抛 KernelError INVALID_PARAM)。 */\nexport async function resolveUid(\n uin: string,\n uinToUid: (uins: string[]) => Promise<Map<string, string>>,\n): Promise<string> {\n const uidMap = await uinToUid([uin]);\n const uid = uidMap.get(uin);\n if (uid === undefined) {\n throw kernelError(`用户 ${uin} 的 uid 解析失败`, \"INVALID_PARAM\");\n }\n return uid;\n}\n","/**\n * delete_friend 动作:删除好友(P2-11 接 kernel FriendApi.deleteFriend)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst deleteFriendSchema = z.object({\n user_id: z.number(),\n});\n\ntype DeleteFriendPayload = z.infer<typeof deleteFriendSchema>;\n\n/** 删除好友(P2-11 接 kernel deleteFriend)。 */\nexport class DeleteFriendAction extends BaseAction<DeleteFriendPayload, null> {\n readonly name = \"delete_friend\";\n readonly schema = deleteFriendSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"friendApi\" | \"uinToUid\">;\n\n constructor(deps: Pick<OneBotApi, \"friendApi\" | \"uinToUid\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: DeleteFriendPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n await this.deps.friendApi.deleteFriend(uid);\n return null;\n }\n}\n","/**\n * get_doubt_friends_add_request 动作:获取可疑好友申请(NapCat 扩展,P2-11)\n */\n\nimport type { DoubtFriendRequestInfo, FriendApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getDoubtFriendsAddRequestSchema = z.object({\n count: z.number().optional(),\n});\n\ntype GetDoubtFriendsAddRequestPayload = z.infer<typeof getDoubtFriendsAddRequestSchema>;\n\n/** 默认获取数量。 */\nconst DEFAULT_COUNT = 50;\n\n/** 获取可疑好友申请(P2-11 接 kernel getDoubtFriendRequest)。 */\nexport class GetDoubtFriendsAddRequestAction extends BaseAction<\n GetDoubtFriendsAddRequestPayload,\n DoubtFriendRequestInfo[]\n> {\n readonly name = \"get_doubt_friends_add_request\";\n readonly schema = getDoubtFriendsAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly friendApi: FriendApi;\n\n constructor(friendApi: FriendApi) {\n super();\n this.friendApi = friendApi;\n }\n\n protected _handle(\n payload: GetDoubtFriendsAddRequestPayload,\n ): Promise<DoubtFriendRequestInfo[]> {\n return this.friendApi.getDoubtFriendRequest(payload.count ?? DEFAULT_COUNT);\n }\n}\n","/**\n * get_friend_list 动作:获取好友列表(P2-4 接 kernel FriendApi)\n */\n\nimport type { FriendApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { FriendInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getFriendListSchema = z.object({\n /** 是否忽略缓存(go-cqhttp 扩展)。 */\n no_cache: z.boolean().optional(),\n});\n\ntype GetFriendListPayload = z.infer<typeof getFriendListSchema>;\n\n/** 获取好友列表(P2-4 接 kernel apis/friend)。 */\nexport class GetFriendListAction extends BaseAction<GetFriendListPayload, FriendInfo[]> {\n readonly name = \"get_friend_list\";\n readonly schema = getFriendListSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly friendApi: FriendApi;\n\n constructor(friendApi: FriendApi) {\n super();\n this.friendApi = friendApi;\n }\n\n protected async _handle(_payload: GetFriendListPayload): Promise<FriendInfo[]> {\n const friends = await this.friendApi.getFriendList();\n return friends.map((f) => {\n const info: FriendInfo = {\n user_id: Number(f.uin),\n nickname: f.nickname,\n };\n if (f.remark !== \"\") {\n info.remark = f.remark;\n }\n return info;\n });\n }\n}\n","/**\n * get_friends_with_category 动作:获取好友列表(含分类,NapCat 扩展,P2-11)\n *\n * 返回分类结构:categoryId / categorySortId / categoryName / categoryMbCount /\n * onlineCount / buddyList(Friend[]:uin/nickname/remark)。\n */\n\nimport type { FriendApi, FriendCategory } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getFriendsWithCategorySchema = z.object({});\n\ntype GetFriendsWithCategoryPayload = z.infer<typeof getFriendsWithCategorySchema>;\n\n/** 获取好友列表(含分类,P2-11 接 kernel getFriendCategories)。 */\nexport class GetFriendsWithCategoryAction extends BaseAction<\n GetFriendsWithCategoryPayload,\n FriendCategory[]\n> {\n readonly name = \"get_friends_with_category\";\n readonly schema = getFriendsWithCategorySchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly friendApi: FriendApi;\n\n constructor(friendApi: FriendApi) {\n super();\n this.friendApi = friendApi;\n }\n\n protected _handle(_payload: GetFriendsWithCategoryPayload): Promise<FriendCategory[]> {\n return this.friendApi.getFriendCategories();\n }\n}\n","/**\n * get_stranger_info 动作:获取陌生人信息(P2-15 接 kernel ProfileApi.getStrangerInfo)\n */\nimport type { ProfileApi, StrangerInfo } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getStrangerInfoSchema = z.object({\n user_id: z.number(),\n no_cache: z.boolean().optional(),\n});\n\ntype GetStrangerInfoPayload = z.infer<typeof getStrangerInfoSchema>;\n\n/** 获取陌生人信息(P2-15 接 kernel ProfileApi)。 */\nexport class GetStrangerInfoAction extends BaseAction<GetStrangerInfoPayload, StrangerInfo> {\n readonly name = \"get_stranger_info\";\n readonly schema = getStrangerInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly profileApi: ProfileApi;\n\n constructor(profileApi: ProfileApi) {\n super();\n this.profileApi = profileApi;\n }\n\n protected async _handle(payload: GetStrangerInfoPayload): Promise<StrangerInfo> {\n const info = await this.profileApi.getStrangerInfo(String(payload.user_id));\n return {\n ...info,\n user_id: payload.user_id,\n };\n }\n}\n","/**\n * send_like 动作:点赞(P2-14 接 kernel ProfileLikeApi.sendLike)\n */\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst sendLikeSchema = z.object({\n user_id: z.number(),\n times: z.number().optional(),\n});\n\ntype SendLikePayload = z.infer<typeof sendLikeSchema>;\n\n/** send_like 依赖(uinToUid 转 uid,OneBotApi 视图)。 */\nexport type SendLikeDeps = Pick<OneBotApi, \"profileLikeApi\" | \"uinToUid\">;\n\n/** 点赞(P2-14 接 kernel ProfileLikeApi)。 */\nexport class SendLikeAction extends BaseAction<SendLikePayload, null> {\n readonly name = \"send_like\";\n readonly schema = sendLikeSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SendLikeDeps;\n\n constructor(deps: SendLikeDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SendLikePayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n await this.deps.profileLikeApi.sendLike(uid, payload.times ?? 1);\n return null;\n }\n}\n","/**\n * set_doubt_friends_add_request 动作:处理可疑好友申请(NapCat 扩展,P2-11)\n *\n * flag=uid(get_doubt_friends_add_request 返回的 flag)→ handleDoubtFriendRequest。\n * approve 字段 NapCat 强制为 true(该接口无语义,仅保留)。\n */\n\nimport type { FriendApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setDoubtFriendsAddRequestSchema = z.object({\n flag: z.string(),\n approve: z.boolean().optional(),\n});\n\ntype SetDoubtFriendsAddRequestPayload = z.infer<typeof setDoubtFriendsAddRequestSchema>;\n\n/** 处理可疑好友申请(P2-11 接 kernel handleDoubtFriendRequest)。 */\nexport class SetDoubtFriendsAddRequestAction extends BaseAction<\n SetDoubtFriendsAddRequestPayload,\n null\n> {\n readonly name = \"set_doubt_friends_add_request\";\n readonly schema = setDoubtFriendsAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly friendApi: FriendApi;\n\n constructor(friendApi: FriendApi) {\n super();\n this.friendApi = friendApi;\n }\n\n protected _handle(payload: SetDoubtFriendsAddRequestPayload): Promise<null> {\n this.friendApi.handleDoubtFriendRequest(payload.flag);\n return Promise.resolve(null);\n }\n}\n","/**\n * set_friend_add_request 动作:处理加好友请求(P2-11)\n *\n * flag=reqTime(NapCat 约定,需从好友请求事件上报中获取)→ getBuddyReqList\n * 匹配 → handleFriendRequest(notify, approve) + optional remark。\n */\n\nimport { type FriendApi, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setFriendAddRequestSchema = z.object({\n flag: z.string(),\n approve: z.boolean().optional(),\n remark: z.string().optional(),\n});\n\ntype SetFriendAddRequestPayload = z.infer<typeof setFriendAddRequestSchema>;\n\n/** 处理加好友请求(P2-11 接 kernel FriendApi)。 */\nexport class SetFriendAddRequestAction extends BaseAction<SetFriendAddRequestPayload, null> {\n readonly name = \"set_friend_add_request\";\n readonly schema = setFriendAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly friendApi: FriendApi;\n\n constructor(friendApi: FriendApi) {\n super();\n this.friendApi = friendApi;\n }\n\n protected async _handle(payload: SetFriendAddRequestPayload): Promise<null> {\n const list = await this.friendApi.getBuddyReqList();\n const notify = list.find((req) => req.reqTime === payload.flag);\n if (notify === undefined) {\n throw kernelError(\"未找到对应的好友请求(flag 无效或已过期)\", \"NOT_FOUND\");\n }\n await this.friendApi.handleFriendRequest(notify, payload.approve !== false);\n if (payload.remark !== undefined) {\n this.friendApi.setFriendRemark(notify.friendUid, payload.remark);\n }\n return null;\n }\n}\n","/**\n * set_friend_remark 动作:设置好友备注(P2-11 接 kernel FriendApi.setFriendRemark)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst setFriendRemarkSchema = z.object({\n user_id: z.number(),\n remark: z.string(),\n});\n\ntype SetFriendRemarkPayload = z.infer<typeof setFriendRemarkSchema>;\n\n/** 设置好友备注(P2-11 接 kernel setFriendRemark)。 */\nexport class SetFriendRemarkAction extends BaseAction<SetFriendRemarkPayload, null> {\n readonly name = \"set_friend_remark\";\n readonly schema = setFriendRemarkSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"friendApi\" | \"uinToUid\">;\n\n constructor(deps: Pick<OneBotApi, \"friendApi\" | \"uinToUid\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SetFriendRemarkPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n this.deps.friendApi.setFriendRemark(uid, payload.remark);\n return null;\n }\n}\n","/**\n * MessageUnique:OneBot message_id ↔ NT msgId 双向映射(P2-3,协议相关)\n *\n * OB11 的 message_id 是 int32;NT msgId 是雪花字符串(如 \"3071303571-1234567890\")。\n * 本类提供稳定双向映射:新消息分配递增 int32,消息事件翻译与 send_msg 返回都走这里,\n * 保证同一 NT 消息在协议侧拿到一致 message_id。\n *\n * 溢出(>2^31-1)后从头分配:优先复用已 release 的槽位(先检查释放池,再线性扫描)。\n */\nimport type { Peer } from \"@napuketto/kernel\";\nimport { kernelError } from \"@napuketto/kernel\";\n\n/** OB11 message_id 上限(int32 max = 0x7FFF_FFFF)。 */\nconst INT32_MAX = 0x7f_ff_ff_ff;\n\n/** int32 下限。 */\nconst INT32_MIN = 1;\n\nexport class MessageUnique {\n /** NT msgId → OB11 message_id。 */\n private readonly msgIdToInt = new Map<string, number>();\n /** OB11 message_id → NT msgId。 */\n private readonly intToMsgId = new Map<number, string>();\n /** NT msgId → Peer(delete_msg / get_msg 等只有 message_id 时反查用)。 */\n private readonly msgIdToPeer = new Map<string, Peer>();\n /** 递增计数器。 */\n private cursor = 1;\n /** 已释放的槽位(可复用)。 */\n private readonly freed = new Set<number>();\n\n /**\n * 为新 NT 消息分配 OB11 message_id(幂等:同一 msgId 返回同一 id)。\n * peer 可选:传入则记录,供 message_id → peer 反查。\n */\n alloc(msgId: string, peer?: Peer): number {\n const existing = this.msgIdToInt.get(msgId);\n if (existing !== undefined) {\n if (peer !== undefined) {\n this.msgIdToPeer.set(msgId, peer);\n }\n return existing;\n }\n const id = this.nextFreeId();\n this.msgIdToInt.set(msgId, id);\n this.intToMsgId.set(id, msgId);\n if (peer !== undefined) {\n this.msgIdToPeer.set(msgId, peer);\n }\n this.freed.delete(id);\n return id;\n }\n\n /** OB11 message_id → NT msgId。 */\n getMsgId(messageId: number): string | undefined {\n return this.intToMsgId.get(messageId);\n }\n\n /** NT msgId → OB11 message_id(未分配返回 undefined)。 */\n getMessageId(msgId: string): number | undefined {\n return this.msgIdToInt.get(msgId);\n }\n\n /** NT msgId → Peer(alloc 时未记录返回 undefined)。 */\n getPeer(msgId: string): Peer | undefined {\n return this.msgIdToPeer.get(msgId);\n }\n\n /** 释放 NT msgId 占用的槽位(消息过期/删除时调用,可选)。 */\n release(msgId: string): void {\n const id = this.msgIdToInt.get(msgId);\n if (id === undefined) {\n return;\n }\n this.msgIdToInt.delete(msgId);\n this.intToMsgId.delete(id);\n this.msgIdToPeer.delete(msgId);\n this.freed.add(id);\n }\n\n /** 取下一个可用 id:优先释放池,否则递增(溢出后线性扫描空洞)。 */\n private nextFreeId(): number {\n for (const id of this.freed) {\n return id;\n }\n if (this.cursor > INT32_MAX) {\n // 溢出:从头找空洞(O(n),消息量级下可接受)\n for (let i = INT32_MIN; i <= INT32_MAX; i += 1) {\n if (!this.intToMsgId.has(i)) {\n this.cursor = i + 1;\n return i;\n }\n }\n throw kernelError(\"MessageUnique 槽位耗尽(>2^31 条消息)\", \"INVALID_STATE\");\n }\n const id = this.cursor;\n this.cursor += 1;\n return id;\n }\n}\n\n/**\n * 从 OB11 message_id 反查 NT msgId + Peer。\n * delete_msg / get_msg / set_msg_emoji_like / fetch_ptt_text / 精华消息等\n * 只有 message_id 参数的动作共用(消息不存在抛 KernelError NOT_FOUND)。\n */\nexport function resolveMsgIdAndPeer(\n messageId: number | string,\n unique: MessageUnique,\n): { msgId: string; peer: Peer } {\n let shortId: number;\n if (typeof messageId === \"number\") {\n shortId = messageId;\n } else {\n shortId = Number(messageId);\n }\n const msgId = unique.getMsgId(shortId);\n if (msgId === undefined) {\n throw kernelError(`消息 ${messageId} 不存在`, \"NOT_FOUND\");\n }\n const peer = unique.getPeer(msgId);\n if (peer === undefined) {\n throw kernelError(`消息 ${messageId} 无会话记录`, \"NOT_FOUND\");\n }\n return { msgId, peer };\n}\n","/**\n * set_essence_msg 动作:设置精华消息(P2-10 接 kernel GroupApi.addGroupEssence)\n *\n * message_id → msgId + peer(MessageUnique 反查,需群消息)→ addGroupEssence。\n */\n\nimport { ChatType, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setEssenceMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\n/** 精华消息依赖(OneBotApi 视图,由装配方注入)。 */\nexport type EssenceMsgDeps = Pick<OneBotApi, \"groupApi\" | \"messageUnique\">;\n\n/** 精华消息基类(set/delete 共用实现,2026-08-08 克隆合并)。 */\nexport abstract class EssenceMsgBase extends BaseAction<{ message_id: number | string }, null> {\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n protected readonly deps: EssenceMsgDeps;\n\n constructor(deps: EssenceMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: { message_id: number | string }): Promise<null> {\n const { msgId, peer } = resolveMsgIdAndPeer(payload.message_id, this.deps.messageUnique);\n if (peer.chatType !== ChatType.GROUP) {\n throw kernelError(\"精华消息仅支持群聊消息\", \"INVALID_PARAM\");\n }\n await this.operate(peer.peerUid, msgId);\n return null;\n }\n\n /** 具体精华操作(子类实现:addGroupEssence / removeGroupEssence)。 */\n protected abstract operate(groupCode: string, msgId: string): Promise<void>;\n}\n\n/** 设置精华消息(P2-10 接 kernel addGroupEssence)。 */\nexport class SetEssenceMsgAction extends EssenceMsgBase {\n readonly name = \"set_essence_msg\";\n readonly schema = setEssenceMsgSchema;\n\n protected async operate(groupCode: string, msgId: string): Promise<void> {\n await this.deps.groupApi.addGroupEssence(groupCode, msgId);\n }\n}\n","/**\n * delete_essence_msg 动作:取消精华消息(P2-10 接 kernel GroupApi.removeGroupEssence)\n */\n\nimport { z } from \"zod\";\nimport { EssenceMsgBase } from \"./set-essence-msg.js\";\n\nconst deleteEssenceMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\n/** 取消精华消息(P2-10 接 kernel removeGroupEssence)。 */\nexport class DeleteEssenceMsgAction extends EssenceMsgBase {\n readonly name = \"delete_essence_msg\";\n readonly schema = deleteEssenceMsgSchema;\n\n protected async operate(groupCode: string, msgId: string): Promise<void> {\n await this.deps.groupApi.removeGroupEssence(groupCode, msgId);\n }\n}\n","/**\n * get_essence_msg_list 动作:获取群精华消息列表(P2-15 接 kernel WebApi)\n *\n * qun.qq.com digest_list web 接口 → msg_list。msg_content 映射 text/image 段。\n */\nimport type { WebApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OB11MessageSegment } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getEssenceMsgListSchema = z.object({\n group_id: z.number(),\n});\n\ntype GetEssenceMsgListPayload = z.infer<typeof getEssenceMsgListSchema>;\n\n/** 文本段类型(msg_content.msg_type)。 */\nconst MSG_TYPE_TEXT = 1;\n/** 图片段类型(msg_content.msg_type)。 */\nconst MSG_TYPE_IMAGE = 3;\n\n/** 精华消息项 OB11 结构。 */\nexport interface EssenceMsgInfo {\n msg_seq: number;\n msg_random: number;\n sender_id: number;\n sender_nick: string;\n operator_id: number;\n operator_nick: string;\n operator_time: number;\n message_id: number;\n content: OB11MessageSegment[];\n}\n\n/** 获取群精华消息列表(P2-15 接 kernel WebApi)。 */\nexport class GetEssenceMsgListAction extends BaseAction<\n GetEssenceMsgListPayload,\n EssenceMsgInfo[]\n> {\n readonly name = \"get_essence_msg_list\";\n readonly schema = getEssenceMsgListSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly webApi: WebApi;\n\n constructor(webApi: WebApi) {\n super();\n this.webApi = webApi;\n }\n\n protected async _handle(payload: GetEssenceMsgListPayload): Promise<EssenceMsgInfo[]> {\n const list = await this.webApi.getEssenceMsgList(String(payload.group_id));\n const out: EssenceMsgInfo[] = [];\n for (const item of list) {\n const content: OB11MessageSegment[] = [];\n for (const part of item.msg_content ?? []) {\n const seg = toSegment(part);\n if (seg !== null) {\n content.push(seg);\n }\n }\n out.push({\n msg_seq: item.msg_seq,\n msg_random: item.msg_random,\n sender_id: Number(item.sender_uin),\n sender_nick: item.sender_nick,\n operator_id: Number(item.add_digest_uin),\n operator_nick: item.add_digest_nick,\n operator_time: item.add_digest_time,\n message_id: 0,\n content,\n });\n }\n return out;\n }\n}\n\n/** msg_content 项 → OB11 段(1=text 3=image,纯函数)。 */\nfunction toSegment(part: {\n msg_type?: number;\n text?: string;\n image_url?: string;\n}): OB11MessageSegment | null {\n if (part.msg_type === MSG_TYPE_TEXT) {\n return { type: \"text\", data: { text: part.text ?? \"\" } };\n }\n if (part.msg_type === MSG_TYPE_IMAGE) {\n return { type: \"image\", data: { file: part.image_url ?? \"\" } };\n }\n return null;\n}\n","/**\n * get_group_add_request / get_group_ignored_notifies 动作(P2-15 接 kernel GroupNotifyApi)\n *\n * 与 set_group_add_request 呼应:flag=seq 用于应答。\n * - get_group_add_request:未处理申请列表(getSingleScreenNotifies(false))\n * - get_group_ignored_notifies:可疑/忽略列表(getSingleScreenNotifies(true))\n */\nimport type { GroupNotify, GroupNotifyApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupAddRequestSchema = z.object({\n count: z.number().optional(),\n});\n\ntype GetGroupAddRequestPayload = z.infer<typeof getGroupAddRequestSchema>;\n\n/** 默认获取数量。 */\nconst DEFAULT_COUNT = 100;\n\n/** 群请求项 OB11 结构。 */\nexport interface GroupAddRequestItem {\n flag: string;\n group_id: number;\n group_name: string;\n user_id: number;\n user_nick: string;\n type: number;\n checked: boolean;\n postscript: string;\n}\n\n/** 获取未处理群申请(P2-15)。 */\nexport class GetGroupAddRequestAction extends BaseAction<\n GetGroupAddRequestPayload,\n GroupAddRequestItem[]\n> {\n readonly name = \"get_group_add_request\";\n readonly schema = getGroupAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupNotifyApi: GroupNotifyApi;\n\n constructor(groupNotifyApi: GroupNotifyApi) {\n super();\n this.groupNotifyApi = groupNotifyApi;\n }\n\n protected async _handle(payload: GetGroupAddRequestPayload): Promise<GroupAddRequestItem[]> {\n const list = await this.groupNotifyApi.getSingleScreenNotifies(\n false,\n payload.count ?? DEFAULT_COUNT,\n );\n return list.map(toGroupAddRequestItem);\n }\n}\n\n/** 获取被忽略群申请(P2-15)。 */\nexport class GetGroupIgnoredNotifiesAction extends BaseAction<\n GetGroupAddRequestPayload,\n GroupAddRequestItem[]\n> {\n readonly name = \"get_group_ignored_notifies\";\n readonly schema = getGroupAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupNotifyApi: GroupNotifyApi;\n\n constructor(groupNotifyApi: GroupNotifyApi) {\n super();\n this.groupNotifyApi = groupNotifyApi;\n }\n\n protected async _handle(payload: GetGroupAddRequestPayload): Promise<GroupAddRequestItem[]> {\n const list = await this.groupNotifyApi.getSingleScreenNotifies(\n true,\n payload.count ?? DEFAULT_COUNT,\n );\n return list.map(toGroupAddRequestItem);\n }\n}\n\n/** GroupNotify → OB11 群请求项(纯函数)。 */\nfunction toGroupAddRequestItem(notify: GroupNotify): GroupAddRequestItem {\n const { seq, type, status, postscript, user1, group } = notify;\n let groupCode = 0;\n let groupName = \"\";\n if (group !== undefined) {\n const { groupCode: code, groupName: name } = group;\n groupCode = Number(code);\n groupName = name;\n }\n let userId = 0;\n let userNick = \"\";\n if (user1 !== undefined) {\n const { uid, nickName } = user1;\n userId = Number(uid);\n userNick = nickName;\n }\n return {\n flag: seq,\n group_id: groupCode,\n group_name: groupName,\n user_id: userId,\n user_nick: userNick,\n type,\n checked: status !== 1,\n postscript: postscript ?? \"\",\n };\n}\n","/**\n * get_group_at_all_remain 动作:获取群 @全体成员 剩余次数(NapCat 扩展,P2-10)\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupAtAllRemainSchema = z.object({\n group_id: z.number(),\n});\n\ntype GetGroupAtAllRemainPayload = z.infer<typeof getGroupAtAllRemainSchema>;\n\n/** @全体剩余次数返回结构。 */\nexport interface AtAllRemainInfo {\n can_at_all: boolean;\n remain_at_all_count_for_uin: number;\n remain_at_all_count_for_group: number;\n}\n\n/** 获取群 @全体成员 剩余次数(P2-10 接 kernel getGroupRemainAtTimes)。 */\nexport class GetGroupAtAllRemainAction extends BaseAction<\n GetGroupAtAllRemainPayload,\n AtAllRemainInfo\n> {\n readonly name = \"get_group_at_all_remain\";\n readonly schema = getGroupAtAllRemainSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: GetGroupAtAllRemainPayload): Promise<AtAllRemainInfo> {\n const remain = await this.groupApi.getGroupRemainAtTimes(String(payload.group_id));\n return {\n can_at_all: remain.canAtAll,\n remain_at_all_count_for_uin: remain.remainAtAllCountForUin,\n remain_at_all_count_for_group: remain.remainAtAllCountForGroup,\n };\n }\n}\n","/**\n * get_group_honor_info 动作:获取群荣誉信息(P2-15 接 kernel WebApi)\n *\n * qun.qq.com honorlist web 接口;type 缺省 all。\n */\nimport type { GroupHonorWebInfo, WebApi } from \"@napuketto/kernel\";\nimport { WebHonorType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupHonorInfoSchema = z.object({\n group_id: z.number(),\n type: z.string().optional(),\n});\n\ntype GetGroupHonorInfoPayload = z.infer<typeof getGroupHonorInfoSchema>;\n\n/** 获取群荣誉信息(P2-15 接 kernel WebApi)。 */\nexport class GetGroupHonorInfoAction extends BaseAction<\n GetGroupHonorInfoPayload,\n GroupHonorWebInfo\n> {\n readonly name = \"get_group_honor_info\";\n readonly schema = getGroupHonorInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly webApi: WebApi;\n\n constructor(webApi: WebApi) {\n super();\n this.webApi = webApi;\n }\n\n protected _handle(payload: GetGroupHonorInfoPayload): Promise<GroupHonorWebInfo> {\n const type = mapHonorType(payload.type);\n return this.webApi.getGroupHonorInfo(String(payload.group_id), type);\n }\n}\n\n/** type 字符串 → WebHonorType(talkative/performer/legend/emotion/all,纯函数)。 */\nfunction mapHonorType(raw: string | undefined): WebHonorType {\n if (raw === \"talkative\") {\n return WebHonorType.TALKATIVE;\n }\n if (raw === \"performer\") {\n return WebHonorType.PERFORMER;\n }\n if (raw === \"legend\") {\n return WebHonorType.LEGEND;\n }\n if (raw === \"emotion\") {\n return WebHonorType.EMOTION;\n }\n return WebHonorType.ALL;\n}\n","/**\n * OB11 翻译辅助(NT 实体 → OB11 结构,P2-4)\n *\n * 纯函数(ADR-008):只读入参,不调 API、不读缓存。\n * 群成员/群信息等 NT 实体 → OB11 返回结构的薄映射。\n */\nimport { type Group, GroupApi, type GroupDetailInfo, type GroupMember } from \"@napuketto/kernel\";\nimport type { GroupInfo, GroupMemberInfo } from \"../types/index.js\";\n\n/** NT Group → OB11 GroupInfo。 */\nexport function toOb11GroupInfo(group: Group): GroupInfo {\n const info: GroupInfo = {\n group_id: Number(group.groupCode),\n group_name: group.groupName,\n };\n if (typeof group.memberCount === \"number\") {\n info.member_count = group.memberCount;\n }\n if (typeof group.maxMember === \"number\") {\n info.max_member_count = group.maxMember;\n }\n return info;\n}\n\n/** NT GroupDetailInfo → OB11 GroupInfo(getGroupDetailInfo / GroupCache 用)。 */\nexport function toOb11GroupInfoDetail(detail: GroupDetailInfo): GroupInfo {\n const info: GroupInfo = {\n group_id: Number(detail.groupCode),\n group_name: detail.groupName,\n };\n if (typeof detail.memberNum === \"number\") {\n info.member_count = detail.memberNum;\n }\n if (typeof detail.maxMemberNum === \"number\") {\n info.max_member_count = detail.maxMemberNum;\n }\n return info;\n}\n\n/** 禁言秒 → 毫秒(shut_up_timestamp 单位)。 */\nconst SEC_TO_MS = 1000;\n\n/** NT GroupMember → OB11 GroupMemberInfo(uin 由 uidToUin 映射补全)。 */\nexport function toOb11GroupMemberInfo(\n groupCode: string,\n member: GroupMember,\n uidToUin: Map<string, string>,\n): GroupMemberInfo {\n let uinStr = member.uin;\n if (uinStr === \"\") {\n uinStr = uidToUin.get(member.uid) ?? member.uid;\n }\n const info: GroupMemberInfo = {\n group_id: Number(groupCode),\n user_id: Number(uinStr),\n nickname: member.nick,\n role: GroupApi.roleToString(member.role),\n };\n if (member.cardName !== \"\") {\n info.card = member.cardName;\n }\n if (member.memberSpecialTitle !== undefined && member.memberSpecialTitle !== \"\") {\n info.title = member.memberSpecialTitle;\n info.special_title = member.memberSpecialTitle;\n }\n if (member.shutUpTime > 0) {\n info.shut_up_timestamp = member.shutUpTime * SEC_TO_MS;\n }\n if (member.joinTime !== \"\" && member.joinTime !== \"0\") {\n info.join_time = Number(member.joinTime);\n }\n if (member.lastSpeakTime !== \"\" && member.lastSpeakTime !== \"0\") {\n info.last_sent_time = Number(member.lastSpeakTime);\n }\n if (typeof member.age === \"number\") {\n info.age = member.age;\n }\n return info;\n}\n","/**\n * get_group_info 动作:获取群信息(P2-4 接 kernel GroupApi;P2-17 读缓存)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { toOb11GroupInfoDetail } from \"../../helper/translate.js\";\nimport type { GroupInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupInfoSchema = z.object({\n group_id: z.number(),\n /** 是否忽略缓存(go-cqhttp 扩展)。 */\n no_cache: z.boolean().optional(),\n});\n\ntype GetGroupInfoPayload = z.infer<typeof getGroupInfoSchema>;\n\n/** 获取群信息(P2-4 接 kernel apis/group;P2-17 优先读 GroupCache)。 */\nexport class GetGroupInfoAction extends BaseAction<GetGroupInfoPayload, GroupInfo> {\n readonly name = \"get_group_info\";\n readonly schema = getGroupInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">;\n\n constructor(deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupInfoPayload): Promise<GroupInfo> {\n const groupCode = String(payload.group_id);\n if (payload.no_cache !== true && this.deps.groupCache !== undefined) {\n const detail = await this.deps.groupCache.getGroupDetail(groupCode);\n return toOb11GroupInfoDetail(detail);\n }\n const detail = await this.deps.groupApi.getGroupInfo(groupCode);\n return toOb11GroupInfoDetail(detail);\n }\n}\n","/**\n * get_group_list 动作:获取群列表(P2-4 接 kernel GroupApi + GroupCache)\n *\n * ⚠️ 实测校准(2026-08-08 端到端联调):原生 getGroupList 返回值无数据\n * (仅 { result, errMsg }),列表经 onGroupListUpdate 事件推送 → GroupCache\n * 维护——列表一律从缓存读,no_cache=true 仅触发原生刷新。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { toOb11GroupInfo } from \"../../helper/translate.js\";\nimport type { GroupInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupListSchema = z.object({\n /** 是否忽略缓存(go-cqhttp 扩展)。 */\n no_cache: z.boolean().optional(),\n});\n\ntype GetGroupListPayload = z.infer<typeof getGroupListSchema>;\n\n/** 获取群列表(P2-4 接 kernel apis/group;群列表数据经事件推送,从 GroupCache 读)。 */\nexport class GetGroupListAction extends BaseAction<GetGroupListPayload, GroupInfo[]> {\n readonly name = \"get_group_list\";\n readonly schema = getGroupListSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">;\n\n constructor(deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupListPayload): Promise<GroupInfo[]> {\n // 实测校准(2026-08-08):原生 getGroupList 返回值无数据,列表经\n // onGroupListUpdate 事件推送 → GroupCache 维护;缓存为空时\n // listGroupsRefreshed 主动触发刷新并等待回填。\n // no_cache=true 兼容:始终触发刷新(语义等价缓存必空场景)。\n const groups =\n this.deps.groupCache === undefined\n ? await this.deps.groupApi.getGroupList(true)\n : payload.no_cache === true\n ? await this.deps.groupCache.listGroupsRefreshed()\n : this.deps.groupCache.listGroups();\n return groups.map(toOb11GroupInfo);\n }\n}\n","/**\n * get_group_member_info 动作:获取群成员信息(P2-4 接 kernel GroupApi;P2-17 读缓存)\n */\n\nimport { type GroupMember, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { toOb11GroupMemberInfo } from \"../../helper/translate.js\";\nimport type { GroupMemberInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupMemberInfoSchema = z.object({\n group_id: z.number(),\n user_id: z.number(),\n /** 是否忽略缓存(go-cqhttp 扩展)。 */\n no_cache: z.boolean().optional(),\n});\n\ntype GetGroupMemberInfoPayload = z.infer<typeof getGroupMemberInfoSchema>;\n\n/** 获取群成员信息(P2-4 接 kernel apis/group;P2-17 优先读 GroupCache)。 */\nexport class GetGroupMemberInfoAction extends BaseAction<\n GetGroupMemberInfoPayload,\n GroupMemberInfo\n> {\n readonly name = \"get_group_member_info\";\n readonly schema = getGroupMemberInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">;\n\n constructor(deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupMemberInfoPayload): Promise<GroupMemberInfo> {\n const groupCode = String(payload.group_id);\n // user_id 是 uin:先 uin→uid,再查成员\n const uidMap = await this.deps.groupApi.uinToUid([String(payload.user_id)]);\n const uid = uidMap.get(String(payload.user_id));\n if (uid === undefined) {\n throw kernelError(`成员 ${payload.user_id} 不在群 ${payload.group_id}`, \"NOT_FOUND\");\n }\n const member = await this.resolveMember(groupCode, uid, payload.no_cache === true);\n if (member === undefined) {\n throw kernelError(`成员 ${payload.user_id} 不在群 ${payload.group_id}`, \"NOT_FOUND\");\n }\n const uinMap = await this.deps.groupApi.uidToUin([uid]);\n return toOb11GroupMemberInfo(groupCode, member, uinMap);\n }\n\n /** 读缓存(缺省)或直查 api(no_cache=true / 未装配缓存)。 */\n private async resolveMember(\n groupCode: string,\n uid: string,\n noCache: boolean,\n ): Promise<GroupMember | undefined> {\n if (noCache || this.deps.groupCache === undefined) {\n const members = await this.deps.groupApi.getGroupMemberInfo(groupCode, [uid]);\n const [member] = members;\n return member;\n }\n return await this.deps.groupCache.getMember(groupCode, uid);\n }\n}\n","/**\n * get_group_member_list 动作:获取群成员列表(P2-4 接 kernel GroupApi;P2-17 读缓存)\n */\n\nimport type { GroupMember } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { toOb11GroupMemberInfo } from \"../../helper/translate.js\";\nimport type { GroupMemberInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupMemberListSchema = z.object({\n group_id: z.number(),\n /** 是否忽略缓存(go-cqhttp 扩展)。 */\n no_cache: z.boolean().optional(),\n});\n\ntype GetGroupMemberListPayload = z.infer<typeof getGroupMemberListSchema>;\n\n/** 获取群成员列表(P2-4 接 kernel apis/group;P2-17 优先读 GroupCache)。 */\nexport class GetGroupMemberListAction extends BaseAction<\n GetGroupMemberListPayload,\n GroupMemberInfo[]\n> {\n readonly name = \"get_group_member_list\";\n readonly schema = getGroupMemberListSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">;\n\n constructor(deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupMemberListPayload): Promise<GroupMemberInfo[]> {\n const groupCode = String(payload.group_id);\n const noCache = payload.no_cache === true;\n let members: GroupMember[];\n if (noCache || this.deps.groupCache === undefined) {\n members = await this.deps.groupApi.getGroupMemberList(groupCode, noCache);\n } else {\n members = await this.deps.groupCache.getMembers(groupCode);\n }\n const uinMap = await this.deps.groupApi.uidToUin(members.map((m) => m.uid));\n return members.map((m) => toOb11GroupMemberInfo(groupCode, m, uinMap));\n }\n}\n","/**\n * get_group_shut_list 动作:获取群禁言列表(P2-13 接 kernel GroupNotifyApi)\n *\n * getGroupShutUpMemberList → [{ user_id, nickname, shut_up_time }](uin 经 uidToUin)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupShutListSchema = z.object({\n group_id: z.number(),\n});\n\ntype GetGroupShutListPayload = z.infer<typeof getGroupShutListSchema>;\n\n/** 禁言成员 OB11 结构。 */\nexport interface ShutListMember {\n user_id: number;\n nickname: string;\n shut_up_time: number;\n}\n\n/** 获取群禁言列表(P2-13 接 kernel GroupNotifyApi)。 */\nexport class GetGroupShutListAction extends BaseAction<GetGroupShutListPayload, ShutListMember[]> {\n readonly name = \"get_group_shut_list\";\n readonly schema = getGroupShutListSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupNotifyApi\" | \"uidToUin\">;\n\n constructor(deps: Pick<OneBotApi, \"groupNotifyApi\" | \"uidToUin\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupShutListPayload): Promise<ShutListMember[]> {\n const members = await this.deps.groupNotifyApi.getGroupShutUpMemberList(\n String(payload.group_id),\n );\n const uids = members.map((m) => m.uid);\n let uinMap = new Map<string, string>();\n if (uids.length > 0) {\n uinMap = await this.deps.uidToUin(uids);\n }\n const out: ShutListMember[] = [];\n for (const member of members) {\n out.push({\n user_id: Number(uinMap.get(member.uid) ?? member.uin ?? member.uid),\n nickname: member.nick,\n shut_up_time: member.shutUpTime,\n });\n }\n return out;\n }\n}\n","/**\n * get_group_system_msg 动作:获取群系统消息(P2-13 接 kernel GroupNotifyApi)\n *\n * getSingleScreenNotifies(false, count) → type 1=进群邀请 / 7=入群申请。\n * 返回 OB11 结构:invited_requests / InvitedRequest(兼容别名)/ join_requests。\n */\n\nimport type { GroupNotify } from \"@napuketto/kernel\";\nimport { GroupNotifyMsgType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupSystemMsgSchema = z.object({\n count: z.number().optional(),\n});\n\ntype GetGroupSystemMsgPayload = z.infer<typeof getGroupSystemMsgSchema>;\n\n/** 默认获取数量。 */\nconst DEFAULT_COUNT = 50;\n\n/** 群系统消息返回结构。 */\nexport interface GroupSystemMessageInfo {\n request_id: number;\n invitor_uin: number;\n invitor_nick: string;\n group_id: number;\n message: string;\n group_name: string;\n checked: boolean;\n actor: number;\n requester_nick: string;\n}\n\n/** 群系统消息返回。 */\nexport interface GroupSystemMsgResult {\n invited_requests: GroupSystemMessageInfo[];\n InvitedRequest: GroupSystemMessageInfo[];\n join_requests: GroupSystemMessageInfo[];\n}\n\n/** 获取群系统消息(P2-13 接 kernel GroupNotifyApi)。 */\nexport class GetGroupSystemMsgAction extends BaseAction<\n GetGroupSystemMsgPayload,\n GroupSystemMsgResult\n> {\n readonly name = \"get_group_system_msg\";\n readonly schema = getGroupSystemMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupNotifyApi\" | \"uidToUin\">;\n\n constructor(deps: Pick<OneBotApi, \"groupNotifyApi\" | \"uidToUin\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupSystemMsgPayload): Promise<GroupSystemMsgResult> {\n const count = payload.count ?? DEFAULT_COUNT;\n const notifies = await this.deps.groupNotifyApi.getSingleScreenNotifies(false, count);\n const uinMap = await this.collectUinMap(notifies);\n const invited: GroupSystemMessageInfo[] = [];\n const joined: GroupSystemMessageInfo[] = [];\n for (const notify of notifies) {\n const info = toMessageInfo(notify, uinMap);\n if (notify.type === GroupNotifyMsgType.INVITED_BY_MEMBER) {\n invited.push(info);\n } else if (notify.type === GroupNotifyMsgType.REQUEST_JOIN_NEED_ADMINI_STRATOR_PASS) {\n joined.push(info);\n }\n }\n const result = {\n invited_requests: invited,\n join_requests: joined,\n } as GroupSystemMsgResult;\n // 兼容别名 InvitedRequest(对象字面量 PascalCase 键被 useNamingConvention 拦截,改用索引)\n result[\"InvitedRequest\"] = invited;\n return result;\n }\n\n /** 收集全部涉及的 uid 批量转 uin(循环外一次请求)。 */\n private async collectUinMap(notifies: GroupNotify[]): Promise<Map<string, string>> {\n const uids: string[] = [];\n for (const notify of notifies) {\n const { user1, user2 } = notify;\n if (user1 !== undefined) {\n const { uid } = user1;\n if (uid !== \"\") {\n uids.push(uid);\n }\n }\n if (user2 !== undefined) {\n const { uid } = user2;\n if (uid !== \"\") {\n uids.push(uid);\n }\n }\n }\n if (uids.length === 0) {\n return new Map();\n }\n return await this.deps.uidToUin(uids);\n }\n}\n\n/** GroupNotify → OB11 群系统消息结构(纯函数,uin 已批量转换)。 */\nfunction toMessageInfo(notify: GroupNotify, uinMap: Map<string, string>): GroupSystemMessageInfo {\n const { seq, status, postscript, user1, user2, group } = notify;\n let user1Uid = \"\";\n if (user1 !== undefined) {\n const { uid } = user1;\n user1Uid = uid;\n }\n let user2Uid = \"\";\n if (user2 !== undefined) {\n const { uid } = user2;\n user2Uid = uid;\n }\n let groupCode = 0;\n let groupName = \"\";\n if (group !== undefined) {\n const { groupCode: code, groupName: name } = group;\n groupCode = Number(code);\n groupName = name;\n }\n let invitorUin = Number(user1Uid);\n const mapped1 = uinMap.get(user1Uid);\n if (mapped1 !== undefined) {\n invitorUin = Number(mapped1);\n }\n let actor = Number(user2Uid);\n const mapped2 = uinMap.get(user2Uid);\n if (mapped2 !== undefined) {\n actor = Number(mapped2);\n }\n let invitorNick = \"\";\n if (user1 !== undefined) {\n const { nickName } = user1;\n invitorNick = nickName;\n }\n return {\n request_id: Number(seq),\n invitor_uin: invitorUin,\n invitor_nick: invitorNick,\n group_id: groupCode,\n message: postscript ?? \"\",\n group_name: groupName,\n checked: status !== 1,\n actor,\n requester_nick: invitorNick,\n };\n}\n","/**\n * 群文件操作动作(P2-14):create_group_file_folder / delete_group_file /\n * delete_group_folder / rename_group_file / move_group_file / trans_group_file\n */\nimport type { RichMediaApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst createGroupFileFolderSchema = z.object({\n group_id: z.number(),\n folder_name: z.string(),\n});\n\ntype CreateGroupFileFolderPayload = z.infer<typeof createGroupFileFolderSchema>;\n\n/** 创建群文件夹(P2-14)。 */\nexport class CreateGroupFileFolderAction extends BaseAction<\n CreateGroupFileFolderPayload,\n { folder_id: string }\n> {\n readonly name = \"create_group_file_folder\";\n readonly schema = createGroupFileFolderSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: CreateGroupFileFolderPayload): Promise<{ folder_id: string }> {\n const folderId = await this.richMediaApi.createGroupFolder(\n String(payload.group_id),\n payload.folder_name,\n );\n return { folder_id: folderId };\n }\n}\n\nconst deleteGroupFileSchema = z.object({\n group_id: z.number(),\n file_id: z.string(),\n /** 兼容 go-cqhttp 的 file_ids 数组(取第一个)。 */\n file_ids: z.array(z.string()).optional(),\n});\n\ntype DeleteGroupFilePayload = z.infer<typeof deleteGroupFileSchema>;\n\n/** 删除群文件(P2-14)。 */\nexport class DeleteGroupFileAction extends BaseAction<DeleteGroupFilePayload, null> {\n readonly name = \"delete_group_file\";\n readonly schema = deleteGroupFileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: DeleteGroupFilePayload): Promise<null> {\n const ids = payload.file_ids ?? [payload.file_id];\n await this.richMediaApi.deleteGroupFile(String(payload.group_id), ids);\n return null;\n }\n}\n\nconst deleteGroupFolderSchema = z.object({\n group_id: z.number(),\n folder_id: z.string(),\n});\n\ntype DeleteGroupFolderPayload = z.infer<typeof deleteGroupFolderSchema>;\n\n/** 删除群文件夹(P2-14)。 */\nexport class DeleteGroupFolderAction extends BaseAction<DeleteGroupFolderPayload, null> {\n readonly name = \"delete_group_folder\";\n readonly schema = deleteGroupFolderSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: DeleteGroupFolderPayload): Promise<null> {\n await this.richMediaApi.deleteGroupFolder(String(payload.group_id), payload.folder_id);\n return null;\n }\n}\n\nconst renameGroupFileSchema = z.object({\n group_id: z.number(),\n file_id: z.string(),\n new_name: z.string(),\n});\n\ntype RenameGroupFilePayload = z.infer<typeof renameGroupFileSchema>;\n\n/** 重命名群文件(P2-14)。 */\nexport class RenameGroupFileAction extends BaseAction<RenameGroupFilePayload, null> {\n readonly name = \"rename_group_file\";\n readonly schema = renameGroupFileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: RenameGroupFilePayload): Promise<null> {\n await this.richMediaApi.renameGroupFile(\n String(payload.group_id),\n payload.file_id,\n payload.new_name,\n );\n return null;\n }\n}\n\nconst moveGroupFileSchema = z.object({\n group_id: z.number(),\n file_id: z.string(),\n file_ids: z.array(z.string()).optional(),\n /** 目标文件夹 ID(空为根目录)。 */\n folder_id: z.string().optional(),\n});\n\ntype MoveGroupFilePayload = z.infer<typeof moveGroupFileSchema>;\n\n/** 移动群文件(P2-14)。 */\nexport class MoveGroupFileAction extends BaseAction<MoveGroupFilePayload, null> {\n readonly name = \"move_group_file\";\n readonly schema = moveGroupFileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: MoveGroupFilePayload): Promise<null> {\n const ids = payload.file_ids ?? [payload.file_id];\n await this.richMediaApi.moveGroupFile(\n String(payload.group_id),\n ids,\n payload.folder_id ?? \"\",\n );\n return null;\n }\n}\n\nconst transGroupFileSchema = z.object({\n group_id: z.number(),\n file_id: z.string(),\n});\n\ntype TransGroupFilePayload = z.infer<typeof transGroupFileSchema>;\n\n/** 转存群文件(P2-14)。 */\nexport class TransGroupFileAction extends BaseAction<TransGroupFilePayload, null> {\n readonly name = \"trans_group_file\";\n readonly schema = transGroupFileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: TransGroupFilePayload): Promise<null> {\n await this.richMediaApi.transGroupFile(String(payload.group_id), payload.file_id);\n return null;\n }\n}\n","/**\n * 群文件查询动作(P2-14):get_group_root_files / get_group_files_by_folder /\n * get_group_file_system_info\n */\nimport type {\n GroupFileItemInfo,\n GroupFolderInfo as KernelFolderInfo,\n RichMediaApi,\n} from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupRootFilesSchema = z.object({\n group_id: z.number(),\n file_count: z.number().optional(),\n});\n\ntype GetGroupRootFilesPayload = z.infer<typeof getGroupRootFilesSchema>;\n\n/** 默认文件数量。 */\nconst DEFAULT_FILE_COUNT = 50;\n\n/** 文件条目 OB11 结构。 */\nexport interface GroupFileInfo {\n file_id: string;\n file_name: string;\n file_size: string;\n uploader?: number;\n upload_time?: number;\n modify_time?: number;\n}\n\n/** 文件夹条目 OB11 结构。 */\nexport interface GroupFolderInfo {\n folder_id: string;\n folder_name: string;\n}\n\n/** 群文件列表返回。 */\nexport interface GroupFilesResult {\n files: GroupFileInfo[];\n folders: GroupFolderInfo[];\n}\n\n/** 获取群根目录文件列表(P2-14 接 kernel RichMediaApi)。 */\nexport class GetGroupRootFilesAction extends BaseAction<\n GetGroupRootFilesPayload,\n GroupFilesResult\n> {\n readonly name = \"get_group_root_files\";\n readonly schema = getGroupRootFilesSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: GetGroupRootFilesPayload): Promise<GroupFilesResult> {\n const list = await this.richMediaApi.getGroupFileList(\n String(payload.group_id),\n \"\",\n payload.file_count ?? DEFAULT_FILE_COUNT,\n );\n return splitFilesAndFolders(list);\n }\n}\n\nconst getGroupFilesByFolderSchema = z.object({\n group_id: z.number(),\n folder_id: z.string(),\n file_count: z.number().optional(),\n});\n\ntype GetGroupFilesByFolderPayload = z.infer<typeof getGroupFilesByFolderSchema>;\n\n/** 获取群指定文件夹文件列表(P2-14)。 */\nexport class GetGroupFilesByFolderAction extends BaseAction<\n GetGroupFilesByFolderPayload,\n GroupFilesResult\n> {\n readonly name = \"get_group_files_by_folder\";\n readonly schema = getGroupFilesByFolderSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: GetGroupFilesByFolderPayload): Promise<GroupFilesResult> {\n const list = await this.richMediaApi.getGroupFileList(\n String(payload.group_id),\n payload.folder_id,\n payload.file_count ?? DEFAULT_FILE_COUNT,\n );\n return splitFilesAndFolders(list);\n }\n}\n\nconst getGroupFileSystemInfoSchema = z.object({\n group_id: z.number(),\n});\n\ntype GetGroupFileSystemInfoPayload = z.infer<typeof getGroupFileSystemInfoSchema>;\n\n/** 群文件系统信息(P2-14)。 */\nexport class GetGroupFileSystemInfoAction extends BaseAction<\n GetGroupFileSystemInfoPayload,\n { file_count: number; limit_count: number; used_space: number; total_space: number }\n> {\n readonly name = \"get_group_file_system_info\";\n readonly schema = getGroupFileSystemInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: GetGroupFileSystemInfoPayload): Promise<{\n file_count: number;\n limit_count: number;\n used_space: number;\n total_space: number;\n }> {\n const info = await this.richMediaApi.getGroupFileSystemInfo(String(payload.group_id));\n return {\n file_count: info.fileCount,\n limit_count: info.limitCount,\n used_space: info.usedSpace,\n total_space: info.totalSpace,\n };\n }\n}\n\n/** 列表拆分 files/folders(fileInfo/folderInfo 取其一,纯函数)。 */\nfunction splitFilesAndFolders(\n list: Array<{ fileInfo?: GroupFileItemInfo; folderInfo?: KernelFolderInfo }>,\n): GroupFilesResult {\n const files: GroupFileInfo[] = [];\n const folders: GroupFolderInfo[] = [];\n for (const item of list) {\n const file = item.fileInfo;\n if (file === undefined) {\n const folder = item.folderInfo;\n if (folder !== undefined) {\n folders.push(toGroupFolderInfo(folder));\n }\n } else {\n const out = toGroupFileInfo(file);\n files.push(out);\n }\n }\n return { files, folders };\n}\n\n/** GroupFileItemInfo → OB11 文件结构(纯函数)。 */\nfunction toGroupFileInfo(file: GroupFileItemInfo): GroupFileInfo {\n const out: GroupFileInfo = {\n file_id: file.fileId,\n file_name: file.fileName,\n file_size: file.fileSize,\n };\n if (file.uploaderUin !== undefined) {\n out.uploader = Number(file.uploaderUin);\n }\n if (file.uploadTime !== undefined) {\n out.upload_time = file.uploadTime;\n }\n if (file.modifyTime !== undefined) {\n out.modify_time = file.modifyTime;\n }\n return out;\n}\n\n/** KernelFolderInfo → OB11 文件夹结构(纯函数)。 */\nfunction toGroupFolderInfo(folder: KernelFolderInfo): GroupFolderInfo {\n return {\n folder_id: folder.folderId,\n folder_name: folder.folderName,\n };\n}\n","/**\n * set_group_add_request 动作:处理加群请求(P2-13 接 kernel GroupNotifyApi)\n *\n * flag=seq(群请求事件上报的 flag)→ getSingleScreenNotifies(doubt, count)\n * 匹配 → handleGroupRequest(approve=true→同意 / false→拒绝,reason 默认空格)。\n */\n\nimport {\n type GroupNotify,\n type GroupNotifyApi,\n kernelError,\n NTGroupRequestOperateTypes,\n} from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setGroupAddRequestSchema = z.object({\n flag: z.string(),\n approve: z.boolean().optional(),\n reason: z.string().optional(),\n count: z.number().optional(),\n});\n\ntype SetGroupAddRequestPayload = z.infer<typeof setGroupAddRequestSchema>;\n\n/** 默认搜索通知数量。 */\nconst DEFAULT_COUNT = 100;\n\n/** 处理加群请求(P2-13 接 kernel GroupNotifyApi)。 */\nexport class SetGroupAddRequestAction extends BaseAction<SetGroupAddRequestPayload, null> {\n readonly name = \"set_group_add_request\";\n readonly schema = setGroupAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupNotifyApi: GroupNotifyApi;\n\n constructor(groupNotifyApi: GroupNotifyApi) {\n super();\n this.groupNotifyApi = groupNotifyApi;\n }\n\n protected async _handle(payload: SetGroupAddRequestPayload): Promise<null> {\n const count = payload.count ?? DEFAULT_COUNT;\n const notify = await this.findNotify(payload.flag, count);\n if (notify === null) {\n throw kernelError(\"未找到对应的群请求(flag 无效或已过期)\", \"NOT_FOUND\");\n }\n let operateType: NTGroupRequestOperateTypes = NTGroupRequestOperateTypes.KREFUSE;\n if (payload.approve !== false) {\n operateType = NTGroupRequestOperateTypes.KAGREE;\n }\n await this.groupNotifyApi.handleGroupRequest(\n false,\n notify,\n operateType,\n payload.reason ?? \" \",\n );\n return null;\n }\n\n /** 按 seq 匹配通知(先非可疑,后可疑)。 */\n private async findNotify(flag: string, count: number): Promise<GroupNotify | null> {\n const normal = await this.groupNotifyApi.getSingleScreenNotifies(false, count);\n const hit = normal.find((item) => item.seq === flag);\n if (hit !== undefined) {\n return hit;\n }\n const doubt = await this.groupNotifyApi.getSingleScreenNotifies(true, count);\n return doubt.find((item) => item.seq === flag) ?? null;\n }\n}\n","/**\n * set_group_admin 动作:设置群管理员(P2-10 接 kernel GroupApi.setMemberRole)\n *\n * enable=true 设为管理员,false 取消;user_id → uinToUid。\n */\n\nimport { type GroupApi, NTGroupMemberRole } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst setGroupAdminSchema = z.object({\n group_id: z.number(),\n user_id: z.number(),\n /** 是否设为管理员。 */\n enable: z.boolean().default(true),\n});\n\ntype SetGroupAdminPayload = z.infer<typeof setGroupAdminSchema>;\n\n/** 设置群管理员(P2-10 接 kernel setMemberRole)。 */\nexport class SetGroupAdminAction extends BaseAction<SetGroupAdminPayload, null> {\n readonly name = \"set_group_admin\";\n readonly schema = setGroupAdminSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupAdminPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), (uins) =>\n this.groupApi.uinToUid(uins),\n );\n let role: NTGroupMemberRole = NTGroupMemberRole.MEMBER;\n if (payload.enable) {\n role = NTGroupMemberRole.ADMIN;\n }\n this.groupApi.setMemberRole(String(payload.group_id), uid, role);\n return null;\n }\n}\n","/**\n * set_group_ban 动作:群组单人禁言(P2-10 接 kernel GroupApi.setMemberShutUp)\n *\n * duration 秒(0 解除禁言);user_id → uinToUid。\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\n/** 默认禁言时长(秒)。 */\nconst DEFAULT_BAN_DURATION = 30;\n\nconst setGroupBanSchema = z.object({\n group_id: z.number(),\n user_id: z.number(),\n /** 禁言时长(秒),0 解除。 */\n duration: z.number().default(DEFAULT_BAN_DURATION),\n});\n\ntype SetGroupBanPayload = z.infer<typeof setGroupBanSchema>;\n\n/** 群组单人禁言(P2-10 接 kernel setMemberShutUp)。 */\nexport class SetGroupBanAction extends BaseAction<SetGroupBanPayload, null> {\n readonly name = \"set_group_ban\";\n readonly schema = setGroupBanSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupBanPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), (uins) =>\n this.groupApi.uinToUid(uins),\n );\n await this.groupApi.setMemberShutUp(String(payload.group_id), [\n { uid, duration: payload.duration },\n ]);\n return null;\n }\n}\n","/**\n * set_group_card 动作:设置群名片(P2-10 接 kernel GroupApi.setMemberCardName)\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst setGroupCardSchema = z.object({\n group_id: z.number(),\n user_id: z.number(),\n /** 群名片(空串清除)。 */\n card: z.string().optional().default(\"\"),\n});\n\ntype SetGroupCardPayload = z.infer<typeof setGroupCardSchema>;\n\n/** 设置群名片(P2-10 接 kernel setMemberCardName)。 */\nexport class SetGroupCardAction extends BaseAction<SetGroupCardPayload, null> {\n readonly name = \"set_group_card\";\n readonly schema = setGroupCardSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupCardPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), (uins) =>\n this.groupApi.uinToUid(uins),\n );\n this.groupApi.setMemberCardName(String(payload.group_id), uid, payload.card);\n return null;\n }\n}\n","/**\n * set_group_kick 动作:群组踢人(P2-10 接 kernel GroupApi.kickMember)\n *\n * user_id(uin)→ uinToUid → kickMember(kickMemberV2)。\n */\n\nimport { type GroupApi, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setGroupKickSchema = z.object({\n group_id: z.number(),\n user_id: z.number(),\n /** 是否拒绝加群请求(拉黑)。 */\n reject_add_request: z.boolean().optional(),\n /** 踢人理由。 */\n kick_reason: z.string().optional(),\n});\n\ntype SetGroupKickPayload = z.infer<typeof setGroupKickSchema>;\n\n/** 群组踢人(P2-10 接 kernel kickMember)。 */\nexport class SetGroupKickAction extends BaseAction<SetGroupKickPayload, null> {\n readonly name = \"set_group_kick\";\n readonly schema = setGroupKickSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupKickPayload): Promise<null> {\n const uid = await this.resolveUid(payload.user_id);\n await this.groupApi.kickMember(\n String(payload.group_id),\n [uid],\n payload.reject_add_request === true,\n payload.kick_reason ?? \"\",\n );\n return null;\n }\n\n /** user_id(uin)→ uid。 */\n private async resolveUid(userId: number): Promise<string> {\n const uidMap = await this.groupApi.uinToUid([String(userId)]);\n const uid = uidMap.get(String(userId));\n if (uid === undefined) {\n throw kernelError(`用户 ${userId} 的 uid 解析失败`, \"INVALID_PARAM\");\n }\n return uid;\n }\n}\n","/**\n * set_group_leave 动作:退出群聊(P2-10 接 kernel GroupApi.quitGroup)\n *\n * is_dismiss=true 解散群(仅群主)。\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setGroupLeaveSchema = z.object({\n group_id: z.number(),\n /** 是否解散群(仅群主可用)。 */\n is_dismiss: z.boolean().optional().default(false),\n});\n\ntype SetGroupLeavePayload = z.infer<typeof setGroupLeaveSchema>;\n\n/** 退出群聊(P2-10 接 kernel quitGroup)。 */\nexport class SetGroupLeaveAction extends BaseAction<SetGroupLeavePayload, null> {\n readonly name = \"set_group_leave\";\n readonly schema = setGroupLeaveSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupLeavePayload): Promise<null> {\n await this.groupApi.quitGroup(String(payload.group_id), payload.is_dismiss);\n return null;\n }\n}\n","/**\n * set_group_name 动作:修改群名(P2-10 接 kernel GroupApi.modifyGroupName)\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setGroupNameSchema = z.object({\n group_id: z.number(),\n group_name: z.string(),\n});\n\ntype SetGroupNamePayload = z.infer<typeof setGroupNameSchema>;\n\n/** 修改群名(P2-10 接 kernel modifyGroupName)。 */\nexport class SetGroupNameAction extends BaseAction<SetGroupNamePayload, null> {\n readonly name = \"set_group_name\";\n readonly schema = setGroupNameSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupNamePayload): Promise<null> {\n await this.groupApi.modifyGroupName(String(payload.group_id), payload.group_name);\n return null;\n }\n}\n","/**\n * set_group_whole_ban 动作:群组全员禁言(P2-10 接 kernel GroupApi.setGroupShutUp)\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setGroupWholeBanSchema = z.object({\n group_id: z.number(),\n /** 是否开启全员禁言。 */\n enable: z.boolean().default(true),\n});\n\ntype SetGroupWholeBanPayload = z.infer<typeof setGroupWholeBanSchema>;\n\n/** 群组全员禁言(P2-10 接 kernel setGroupShutUp)。 */\nexport class SetGroupWholeBanAction extends BaseAction<SetGroupWholeBanPayload, null> {\n readonly name = \"set_group_whole_ban\";\n readonly schema = setGroupWholeBanSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupWholeBanPayload): Promise<null> {\n await this.groupApi.setGroupShutUp(String(payload.group_id), payload.enable);\n return null;\n }\n}\n","/**\n * delete_msg 动作:撤回消息(P2-10 接 kernel MsgApi.recallMessage)\n *\n * OB11 标准 delete_msg 只有 message_id;peer 经 MessageUnique 反查。\n * 群聊管理员 / 私聊 2 分钟内可撤回。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst deleteMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\ntype DeleteMsgPayload = z.infer<typeof deleteMsgSchema>;\n\n/** 撤回消息依赖(OneBotApi 视图,由装配方注入)。 */\nexport type DeleteMsgDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\">;\n\n/** 撤回消息(P2-10 接 kernel recallMessage)。 */\nexport class DeleteMsgAction extends BaseAction<DeleteMsgPayload, null> {\n readonly name = \"delete_msg\";\n readonly schema = deleteMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: DeleteMsgDeps;\n\n constructor(deps: DeleteMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: DeleteMsgPayload): Promise<null> {\n const { msgId, peer } = resolveMsgIdAndPeer(payload.message_id, this.deps.messageUnique);\n await this.deps.msgApi.recallMessage(peer, [msgId]);\n return null;\n }\n}\n","/**\n * fetch_ptt_text 动作:获取语音转文字结果(NapCat 扩展,P2-10)\n *\n * message_id → msgId + peer → MsgApi.fetchPttText(内部:拉消息 → 找 PTT 元素\n * → translatePtt2Text → 再拉取读 pttElement.text)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst fetchPttTextSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\ntype FetchPttTextPayload = z.infer<typeof fetchPttTextSchema>;\n\n/** 语音转文字依赖(OneBotApi 视图,由装配方注入)。 */\nexport type FetchPttTextDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\">;\n\n/** 获取语音转文字结果(P2-10 接 kernel fetchPttText)。 */\nexport class FetchPttTextAction extends BaseAction<FetchPttTextPayload, { text: string }> {\n readonly name = \"fetch_ptt_text\";\n readonly schema = fetchPttTextSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: FetchPttTextDeps;\n\n constructor(deps: FetchPttTextDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: FetchPttTextPayload): Promise<{ text: string }> {\n const { msgId, peer } = resolveMsgIdAndPeer(payload.message_id, this.deps.messageUnique);\n const text = await this.deps.msgApi.fetchPttText(msgId, peer);\n return { text };\n }\n}\n","/**\n * OB11 目标 Peer 解析 / 单条消息拉取(多个动作共用,2026-08-08 克隆合并)\n *\n * group_id 直通(群消息 peerUid = 群号);user_id 经 uin→uid 解析。\n */\n\nimport { ChatType, kernelError, type Peer, type RawMessage } from \"@napuketto/kernel\";\nimport type { MessageUnique } from \"../../helper/message-unique.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\n\n/** 解析目标 Peer(group_id 直通;user_id 经 uin→uid)。 */\nexport async function resolveTargetPeer(\n payload: { group_id?: number | undefined; user_id?: number | undefined },\n deps: { uinToUid: (uins: string[]) => Promise<Map<string, string>> },\n missingHint: string,\n): Promise<Peer> {\n if (payload.group_id !== undefined) {\n return { chatType: ChatType.GROUP, peerUid: String(payload.group_id) };\n }\n if (payload.user_id !== undefined) {\n const uidMap = await deps.uinToUid([String(payload.user_id)]);\n const uid = uidMap.get(String(payload.user_id));\n if (uid === undefined) {\n throw kernelError(`用户 ${payload.user_id} 的 uid 解析失败`, \"INVALID_PARAM\");\n }\n return { chatType: ChatType.C2C, peerUid: uid };\n }\n throw kernelError(missingHint, \"INVALID_PARAM\");\n}\n\n/**\n * 按 message_id(OB11 int32 或 NT msgId)拉取单条消息。\n * 消息不存在/已被撤回 → 抛 KernelError NOT_FOUND。\n */\nexport async function fetchMsgById(\n messageId: number | string,\n messageUnique: MessageUnique,\n msgApi: { fetchMsgsByMsgId: (peer: Peer, msgIds: string[]) => Promise<RawMessage[]> },\n): Promise<{ msg: RawMessage; peer: Peer; msgId: string }> {\n const { msgId, peer } = resolveMsgIdAndPeer(messageId, messageUnique);\n const msgs = await msgApi.fetchMsgsByMsgId(peer, [msgId]);\n const [msg] = msgs;\n if (msg === undefined) {\n throw kernelError(`消息 ${messageId} 不存在或已被撤回`, \"NOT_FOUND\");\n }\n return { msg, peer, msgId };\n}\n","/**\n * forward_group_single_msg / forward_friend_single_msg 动作:单条转发(P2-12)\n *\n * message_id 反查源 msgId + peer;group_id/user_id 为目标 →\n * MsgApi.forwardSingleMessage(srcPeer, [msgId], dstPeer)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveTargetPeer } from \"./resolve-peer.js\";\n\nconst forwardSingleMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n group_id: z.number().optional(),\n user_id: z.number().optional(),\n});\n\ntype ForwardSingleMsgPayload = z.infer<typeof forwardSingleMsgSchema>;\n\n/** 单条转发依赖(OneBotApi 视图,由装配方注入)。 */\ntype ForwardSingleMsgDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\" | \"uinToUid\">;\n\n/** 单条转发基类(两个动作共用实现)。 */\nabstract class ForwardSingleMsgBase extends BaseAction<ForwardSingleMsgPayload, null> {\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: ForwardSingleMsgDeps;\n\n constructor(deps: ForwardSingleMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: ForwardSingleMsgPayload): Promise<null> {\n const { msgId, peer: sourcePeer } = resolveMsgIdAndPeer(\n payload.message_id,\n this.deps.messageUnique,\n );\n const dstPeer = await resolveTargetPeer(\n payload,\n this.deps,\n \"单条转发需要 group_id 或 user_id\",\n );\n await this.deps.msgApi.forwardSingleMessage(sourcePeer, [msgId], dstPeer);\n return null;\n }\n}\n\n/** 转发单条消息到群(P2-12)。 */\nexport class ForwardGroupSingleMsgAction extends ForwardSingleMsgBase {\n readonly name = \"forward_group_single_msg\";\n readonly schema = forwardSingleMsgSchema;\n}\n\n/** 转发单条消息到好友(P2-12)。 */\nexport class ForwardFriendSingleMsgAction extends ForwardSingleMsgBase {\n readonly name = \"forward_friend_single_msg\";\n readonly schema = forwardSingleMsgSchema;\n}\n","/**\n * CQ 码编解码(OneBot 11 消息段序列化格式)\n *\n * 纯函数、无 OB11 类型依赖:本文件只处理「文本 ↔ CQ 码片段」的通用编解码,\n * segment 级别的映射在 data.ts(OB11Constructor)。\n *\n * 转义规则(OneBot 11 规范):\n * - 纯文本:& → &amp;,[ → &#91;,] → &#93;\n * - 参数值:额外 , → &#44;\n */\n\n/** 解析单个 CQ 码文本 → 结构化 CqCode。 */\nfunction parseCqCode(raw: string): CqCode {\n const body = raw.slice(\"[CQ:\".length, -1);\n const firstComma = body.indexOf(\",\");\n let type = body;\n if (firstComma !== -1) {\n type = body.slice(0, firstComma);\n }\n const params: Record<string, string> = {};\n if (firstComma !== -1) {\n for (const pair of body.slice(firstComma + 1).split(\",\")) {\n const eq = pair.indexOf(\"=\");\n if (eq > 0) {\n params[pair.slice(0, eq)] = unescapeCqText(pair.slice(eq + 1));\n }\n }\n }\n return { type, params };\n}\n\n/** CQ 码片段([CQ:type,key=value,...] 的结构化表示)。 */\nexport interface CqCode {\n type: string;\n params: Record<string, string>;\n}\n\n/** 转义纯文本(& [ ];& 必须先转,避免二次转义)。 */\nexport function escapeCqText(text: string): string {\n return text.replaceAll(\"&\", \"&amp;\").replaceAll(\"[\", \"&#91;\").replaceAll(\"]\", \"&#93;\");\n}\n\n/** 转义 CQ 码参数值(& [ ] ,)。 */\nexport function escapeCqParam(value: string): string {\n return escapeCqText(value).replaceAll(\",\", \"&#44;\");\n}\n\n/** 反转义(&#44; &#93; &#91; &amp;;&amp; 必须最后解,避免二次转义误伤)。 */\nexport function unescapeCqText(text: string): string {\n return text\n .replaceAll(\"&#44;\", \",\")\n .replaceAll(\"&#93;\", \"]\")\n .replaceAll(\"&#91;\", \"[\")\n .replaceAll(\"&amp;\", \"&\");\n}\n\n/** 编码单个 CQ 码(undefined 参数自动省略)。 */\nexport function encodeCqCode(\n type: string,\n params: Record<string, string | number | undefined>,\n): string {\n const pairs: string[] = [];\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n pairs.push(`${key}=${escapeCqParam(String(value))}`);\n }\n }\n if (pairs.length === 0) {\n return `[CQ:${type}]`;\n }\n return `[CQ:${type},${pairs.join(\",\")}]`;\n}\n\n/**\n * 解析一条消息文本 → 文本片段与 CQ 码片段的混合数组(文本已反转义)。\n *\n * 手工 indexOf 扫描而非全局正则(/\\[CQ:[^\\]]*\\]/g):消息文本不可信,正则在\n * 「大量 [CQ: 前缀且无闭合 ]」的输入下每个起点都全量回扫,复杂度 O(n²)\n * (CodeQL polynomial-redos)。indexOf 语义等价:从 [CQ: 起到其后第一个 ]。\n */\nexport function parseCqMessage(text: string): Array<string | CqCode> {\n const parts: Array<string | CqCode> = [];\n let lastIndex = 0;\n let start = text.indexOf(\"[CQ:\");\n while (start !== -1) {\n const end = text.indexOf(\"]\", start);\n if (end === -1) {\n break; // 无闭合 ]:剩余内容整体按纯文本处理\n }\n if (start > lastIndex) {\n parts.push(unescapeCqText(text.slice(lastIndex, start)));\n }\n parts.push(parseCqCode(text.slice(start, end + 1)));\n lastIndex = end + 1;\n start = text.indexOf(\"[CQ:\", lastIndex);\n }\n if (lastIndex < text.length) {\n parts.push(unescapeCqText(text.slice(lastIndex)));\n }\n return parts;\n}\n\n/** 将混合片段数组序列化回消息文本(parseCqMessage 的逆操作)。 */\nexport function serializeCqParts(parts: Array<string | CqCode>): string {\n let out = \"\";\n for (const part of parts) {\n if (typeof part === \"string\") {\n out += escapeCqText(part);\n } else {\n out += encodeCqCode(part.type, part.params);\n }\n }\n return out;\n}\n","/**\n * OB11 segment 单元素转换(从 data.ts 拆分,2026-08-08 FTA 优化)\n *\n * - canonicalToSegment / segmentToCanonical:单元素 ↔ 单 segment(null = 无法表达跳过)\n * - CQ_SEGMENT_BUILDERS / cqCodeToSegment:CQ 码 → segment(未知类型保留原文为文本段)\n */\nimport type { CanonicalElement } from \"@napuketto/kernel\";\nimport type { OB11MessageSegment } from \"../../types/index.js\";\nimport { type CqCode, encodeCqCode, escapeCqText } from \"./cqcode.js\";\n\n/** OB11 媒体段 data(image/record/video 共用,url 可选)。 */\nfunction mediaData(file: string, url: string | undefined): { file: string; url?: string } {\n const data: { file: string; url?: string } = { file };\n if (url !== undefined) {\n data.url = url;\n }\n return data;\n}\n\n/** OB11 at 段 data(name 可选)。 */\nfunction atData(qq: string, name: string | undefined): { qq: string; name?: string } {\n const data: { qq: string; name?: string } = { qq };\n if (name !== undefined) {\n data.name = name;\n }\n return data;\n}\n\n/** canonical at 元素(display 可选)。 */\nfunction canonicalAt(target: string, display: string | undefined): CanonicalElement {\n const el: CanonicalElement = { type: \"at\", target };\n if (display !== undefined) {\n el.display = display;\n }\n return el;\n}\n\n/** canonical 媒体元素子集(image/voice/video 均含 url 可选字段)。 */\ntype MediaCanonical =\n | { type: \"image\"; path: string; url?: string; size?: { width: number; height: number } }\n | { type: \"voice\"; path: string; url?: string }\n | { type: \"video\"; path: string; url?: string };\n\n/** canonical 媒体元素(image/voice/video,url 可选;type 为联合需断言收窄)。 */\nfunction canonicalMedia(\n type: \"image\" | \"voice\" | \"video\",\n path: string,\n url: string | undefined,\n): CanonicalElement {\n const el: MediaCanonical = { type, path } as MediaCanonical;\n if (url !== undefined) {\n el.url = url;\n }\n return el;\n}\n\n/** canonical json/xml 的 raw → OB11 data 字符串(字符串原样,对象序列化)。 */\nfunction rawToString(raw: unknown): string {\n if (typeof raw === \"string\") {\n return raw;\n }\n return JSON.stringify(raw);\n}\n\n/** canonical 元素 → OB11 segment 转换器(键 = canonical type,判别字段收窄)。 */\nconst CANONICAL_TO_SEGMENT: Record<string, (el: never) => OB11MessageSegment> = {\n text: (el: Extract<CanonicalElement, { type: \"text\" }>) => ({\n type: \"text\" as const,\n data: { text: el.text },\n }),\n at: (el: Extract<CanonicalElement, { type: \"at\" }>) => ({\n type: \"at\" as const,\n data: atData(el.target, el.display),\n }),\n image: (el: Extract<CanonicalElement, { type: \"image\" }>) => ({\n type: \"image\" as const,\n data: mediaData(el.path, el.url),\n }),\n face: (el: Extract<CanonicalElement, { type: \"face\" }>) => ({\n type: \"face\" as const,\n data: { id: el.id },\n }),\n voice: (el: Extract<CanonicalElement, { type: \"voice\" }>) => ({\n type: \"record\" as const,\n data: mediaData(el.path, el.url),\n }),\n video: (el: Extract<CanonicalElement, { type: \"video\" }>) => ({\n type: \"video\" as const,\n data: mediaData(el.path, el.url),\n }),\n // 群/私聊文件(B4,2026-09-08):data.file 取文件名(缺省路径)——go-cqhttp\n // 兼容形状;此前 file 元素被静默丢弃(转换表无此键)\n file: (el: Extract<CanonicalElement, { type: \"file\" }>) => ({\n type: \"file\" as const,\n data: { file: el.name ?? el.path },\n }),\n reply: (el: Extract<CanonicalElement, { type: \"reply\" }>) => ({\n type: \"reply\" as const,\n data: { id: el.messageId },\n }),\n forward: (el: Extract<CanonicalElement, { type: \"forward\" }>) => ({\n type: \"forward\" as const,\n data: { id: el.messageIds[0] ?? \"\" },\n }),\n json: (el: Extract<CanonicalElement, { type: \"json\" }>) => ({\n type: \"json\" as const,\n data: { data: rawToString(el.raw) },\n }),\n xml: (el: Extract<CanonicalElement, { type: \"xml\" }>) => ({\n type: \"xml\" as const,\n data: { data: rawToString(el.raw) },\n }),\n};\n\n/** canonical 元素 → OB11 segment(null = OB11 无法表达,跳过)。 */\nexport function canonicalToSegment(el: CanonicalElement): OB11MessageSegment | null {\n const builder = CANONICAL_TO_SEGMENT[el.type];\n // el.type 是判别字段,与映射键一一对应;as never 规避联合逆变检查\n return builder === undefined ? null : builder(el as never);\n}\n\n/** OB11 segment → canonical 元素转换器(键 = segment type)。 */\nconst SEGMENT_TO_CANONICAL: Record<string, (seg: never) => CanonicalElement> = {\n text: (seg: Extract<OB11MessageSegment, { type: \"text\" }>) => ({\n type: \"text\" as const,\n text: seg.data.text,\n }),\n string: (seg: Extract<OB11MessageSegment, { type: \"string\" }>) => ({\n type: \"text\" as const,\n text: seg.data.text,\n }),\n at: (seg: Extract<OB11MessageSegment, { type: \"at\" }>) =>\n canonicalAt(seg.data.qq, seg.data.name),\n face: (seg: Extract<OB11MessageSegment, { type: \"face\" }>) => ({\n type: \"face\" as const,\n id: seg.data.id,\n }),\n image: (seg: Extract<OB11MessageSegment, { type: \"image\" }>) =>\n canonicalMedia(\"image\", seg.data.file, seg.data.url),\n record: (seg: Extract<OB11MessageSegment, { type: \"record\" }>) =>\n canonicalMedia(\"voice\", seg.data.file, seg.data.url),\n video: (seg: Extract<OB11MessageSegment, { type: \"video\" }>) =>\n canonicalMedia(\"video\", seg.data.file, seg.data.url),\n reply: (seg: Extract<OB11MessageSegment, { type: \"reply\" }>) => ({\n type: \"reply\" as const,\n messageId: seg.data.id,\n }),\n forward: (seg: Extract<OB11MessageSegment, { type: \"forward\" }>) => ({\n type: \"forward\" as const,\n messageIds: [seg.data.id],\n }),\n json: (seg: Extract<OB11MessageSegment, { type: \"json\" }>) => ({\n type: \"json\" as const,\n raw: seg.data.data,\n }),\n xml: (seg: Extract<OB11MessageSegment, { type: \"xml\" }>) => ({\n type: \"xml\" as const,\n raw: seg.data.data,\n }),\n};\n\n/** OB11 segment → canonical 元素(未知 type 兜底按 xml 处理,保持既有行为)。 */\nexport function segmentToCanonical(seg: OB11MessageSegment): CanonicalElement | null {\n const builder = SEGMENT_TO_CANONICAL[seg.type];\n if (builder !== undefined) {\n return builder(seg as never);\n }\n // 未知 type:兜底按 xml 处理(表字面量恒含 xml 键,此处仅类型收窄)\n const xmlBuilder = SEGMENT_TO_CANONICAL[\"xml\"];\n return xmlBuilder === undefined ? null : xmlBuilder(seg as never);\n}\n\n/** CQ 段构造器(params 键可能缺失,undefined 用空串兜底)。 */\ntype CqSegmentBuilder = (params: Record<string, string | undefined>) => OB11MessageSegment;\n\n/** 已知 CQ 类型 → segment 构造器。 */\nconst CQ_SEGMENT_BUILDERS: Record<string, CqSegmentBuilder> = {\n text: (params) => ({ type: \"text\", data: { text: params[\"text\"] ?? \"\" } }),\n at: (params) => ({ type: \"at\", data: atData(params[\"qq\"] ?? \"\", params[\"name\"]) }),\n face: (params) => ({ type: \"face\", data: { id: params[\"id\"] ?? \"\" } }),\n image: (params) => ({\n type: \"image\",\n data: mediaData(params[\"file\"] ?? \"\", params[\"url\"]),\n }),\n record: (params) => ({\n type: \"record\",\n data: mediaData(params[\"file\"] ?? \"\", params[\"url\"]),\n }),\n video: (params) => ({\n type: \"video\",\n data: mediaData(params[\"file\"] ?? \"\", params[\"url\"]),\n }),\n file: (params) => ({\n type: \"file\",\n data: { file: params[\"file\"] ?? \"\" },\n }),\n reply: (params) => ({ type: \"reply\", data: { id: params[\"id\"] ?? \"\" } }),\n forward: (params) => ({ type: \"forward\", data: { id: params[\"id\"] ?? \"\" } }),\n json: (params) => ({ type: \"json\", data: { data: params[\"data\"] ?? \"\" } }),\n xml: (params) => ({ type: \"xml\", data: { data: params[\"data\"] ?? \"\" } }),\n};\n\n/** CQ 码片段 → OB11 segment(未知类型保留原文为 text 段,往返不丢数据)。 */\nexport function cqCodeToSegment(code: CqCode): OB11MessageSegment | null {\n const builder = CQ_SEGMENT_BUILDERS[code.type];\n if (builder === undefined) {\n // 未知 CQ 类型:保留原文为文本段(go-cqhttp 兼容行为)\n return { type: \"text\", data: { text: encodeCqCode(code.type, code.params) } };\n }\n return builder(code.params);\n}\n\n/** OB11 segment 数组 → CQ 码字符串(text 段转义拼接,特殊段编码)。 */\nexport function segmentsToCqMessage(segments: OB11MessageSegment[]): string {\n let out = \"\";\n for (const seg of segments) {\n if (seg.type === \"text\" || seg.type === \"string\") {\n out += escapeCqText(seg.data.text);\n } else {\n out += encodeCqCode(seg.type, seg.data);\n }\n }\n return out;\n}\n","/**\n * OneBot 11 协议配置(zod schema,归属本包,ADR-012)\n * 协议配置 schema 在各自协议包,kernel 只提供 ConfigBase 基类。\n *\n * 2026-08-07 多实例化(P2-18):对齐 NapCat——httpServers / httpPostUrls / wsServers /\n * wsReverseUrls 四个数组实例(每实例可覆盖全局 token);旧单对象字段 http/httpPost/ws/\n * wsReverse 废弃(zod strip 静默忽略,不兼容迁移)。\n */\nimport { z } from \"zod\";\nimport { createHttpServerSchema, createWsServerSchema } from \"../../core/transport-schema.js\";\n\n/** HTTP 反向服务器默认端口。 */\nconst DEFAULT_HTTP_PORT = 3000;\n/** 反向 WS server 默认端口。 */\nconst DEFAULT_WS_PORT = 3001;\n/** 心跳 meta 事件默认间隔(毫秒)。 */\nconst DEFAULT_HEARTBEAT_INTERVAL_MS = 3000;\n/** WS 传输 ping 默认间隔(毫秒)。 */\nconst DEFAULT_WS_HEARTBEAT_MS = 30_000;\n/** WS 反向断线重连默认延迟(毫秒)。 */\nconst DEFAULT_RECONNECT_DELAY_MS = 5000;\n\n/** 消息内容格式(NapCat messagePostFormat)。 */\nconst MESSAGE_FORMATS = [\"array\", \"string\"] as const;\n\n/** HTTP 反向服务器实例(第三方 POST 指令入口)。 */\nconst httpServerSchema = createHttpServerSchema(DEFAULT_HTTP_PORT);\n\n/** HTTP 正向上报实例(Webhook 事件推送)。 */\nconst httpPostSchema = z.object({\n enabled: z.boolean().default(false),\n url: z.string().optional(),\n /** 实例级 token,覆盖全局 token(缺省继承全局)。 */\n token: z.string().optional(),\n /** 上报超时(毫秒),缺省不超时。 */\n timeoutMs: z.number().int().optional(),\n});\n\n/** 反向 WS server 实例(第三方 WS 连入,带 WS ping 间隔扩展字段)。 */\nconst wsServerSchema = createWsServerSchema(DEFAULT_WS_PORT).extend({\n /** WS ping 间隔(毫秒)。 */\n heartbeatInterval: z.number().int().default(DEFAULT_WS_HEARTBEAT_MS),\n});\n\n/** 正向 WS client 实例(主动连接第三方,双向)。 */\nconst wsReverseSchema = z.object({\n enabled: z.boolean().default(false),\n url: z.string().optional(),\n /** 实例级 token,覆盖全局 token(缺省继承全局)。 */\n token: z.string().optional(),\n /** 断线重连延迟(毫秒)。 */\n reconnectDelayMs: z.number().int().default(DEFAULT_RECONNECT_DELAY_MS),\n /** 最大重连次数(缺省无限)。 */\n maxReconnectAttempts: z.number().int().optional(),\n /** wss:// 是否校验证书(自签证书场景设 false,对齐 NapCat enableSelfSigned)。 */\n rejectUnauthorized: z.boolean().default(true),\n /** WS ping 间隔(毫秒)。 */\n heartbeatInterval: z.number().int().default(DEFAULT_WS_HEARTBEAT_MS),\n});\n\n/** OB11 配置 schema。 */\nexport const ob11ConfigSchema = z.object({\n /** 鉴权 token(全局默认,实例未指定时继承)。 */\n token: z.string().optional(),\n /** 心跳 meta 事件间隔(毫秒),0 关闭心跳。 */\n heartbeatInterval: z.number().int().default(DEFAULT_HEARTBEAT_INTERVAL_MS),\n /** 是否上报机器人自己发的消息(缺省 false = OB11 规范行为)。 */\n reportSelfMessage: z.boolean().default(false),\n /** 消息内容格式:array = 消息段数组(标准),string = CQ 码字符串。 */\n messagePostFormat: z.enum(MESSAGE_FORMATS).default(\"array\"),\n /**\n * 群文件报形式(B4,2026-09-08):false(缺省)= message 事件 + file 段\n * (go-cqhttp 兼容;此前 file 元素被静默丢弃,本版本起透出);true = 含\n * fileElement 的群消息改报 group_upload notice 事件(替代 message 事件)。\n */\n groupUploadAsNotice: z.boolean().default(false),\n /** HTTP 反向服务器列表。 */\n httpServers: z.array(httpServerSchema).default([]),\n /** HTTP 正向上报列表。 */\n httpPostUrls: z.array(httpPostSchema).default([]),\n /** 反向 WS server 列表。 */\n wsServers: z.array(wsServerSchema).default([]),\n /** 正向 WS client 列表。 */\n wsReverseUrls: z.array(wsReverseSchema).default([]),\n});\n\n/** OB11 配置类型(由 schema 推导)。 */\nexport type OB11Config = z.infer<typeof ob11ConfigSchema>;\n","/**\n * OB11 消息翻译(ADR-008 翻译层,2026-08-08 拆分)\n *\n * - 单元素 segment 转换(canonicalToSegment / segmentToCanonical)与 CQ 码\n * 构建(CQ_SEGMENT_BUILDERS / cqCodeToSegment / segmentsToCqMessage)→ segment.ts\n * - 本文件保留:批量转换(canonicalToSegments / segmentsToCanonical)与\n * 接收方向 ID 空间翻译(collectReceiveNeeds / applyReceiveContext)\n *\n * 纯函数:只读入参、无副作用,翻译只做结构映射,不调 API、不读缓存。\n * NT 实体 ↔ canonical 在 kernel(types/message-element.ts),本文件只做\n * canonical ↔ OB11(segment / CQ 码)的薄映射。\n */\n\nimport type { CanonicalElement } from \"@napuketto/kernel\";\nimport type { OB11MessageSegment } from \"../types/index.js\";\nimport {\n canonicalToSegment,\n cqCodeToSegment,\n parseCqMessage,\n segmentsToCqMessage,\n segmentToCanonical,\n} from \"./codec/index.js\";\n\n/** canonical 元素数组 → OB11 segment 数组(无法表达的元素静默跳过)。 */\nexport function canonicalToSegments(elements: CanonicalElement[]): OB11MessageSegment[] {\n const segments: OB11MessageSegment[] = [];\n for (const el of elements) {\n const seg = canonicalToSegment(el);\n if (seg !== null) {\n segments.push(seg);\n }\n }\n return segments;\n}\n\n/** OB11 segment 数组 → canonical 元素数组。 */\nexport function segmentsToCanonical(segments: OB11MessageSegment[]): CanonicalElement[] {\n const elements: CanonicalElement[] = [];\n for (const seg of segments) {\n const el = segmentToCanonical(seg);\n if (el !== null) {\n elements.push(el);\n }\n }\n return elements;\n}\n\n/**\n * 接收方向翻译上下文(ID 空间转换,P2-19,2026-08-07)。\n * 翻译核心保持纯函数(ADR-008),调用方在协议边界准备上下文注入:\n * canonical 的 at.target 是 NT uid、reply.messageId 是 NT 雪花 msgId,\n * OB11 需要 uin / OB11 message_id。\n */\n/** OB11 sender.role 值域(群聊;私聊 sender 无 role)。 */\nexport type GroupSenderRole = \"owner\" | \"admin\" | \"member\";\n\nexport interface ReceiveTranslateContext {\n /** uid → uin 映射(at 段目标转换;缺省不转换)。 */\n uidToUin?: Map<string, string>;\n /** NT msgId → OB11 message_id(reply 段转换;缺省不转换)。 */\n msgIdToOb11Id?: (msgId: string) => number | undefined;\n /** 群消息发送者角色(owner/admin,来自 GroupCache;缺省 member)。私聊忽略。 */\n senderRole?: GroupSenderRole;\n}\n\n/**\n * 收集 canonical 元素里需要转换的 at uid / reply NT msgId(接收方向)。\n * 调用方据此批量 uidToUin(一次异步调用),避免逐元素查询。\n */\nexport function collectReceiveNeeds(elements: CanonicalElement[]): {\n atUids: string[];\n replyMsgIds: string[];\n} {\n const atUids = new Set<string>();\n const replyMsgIds = new Set<string>();\n for (const el of elements) {\n if (el.type === \"at\" && el.target !== \"all\") {\n atUids.add(el.target);\n } else if (el.type === \"reply\") {\n replyMsgIds.add(el.messageId);\n }\n }\n return { atUids: [...atUids], replyMsgIds: [...replyMsgIds] };\n}\n\n/**\n * canonical 元素数组 → 应用接收方向 ID 转换(at uid→uin、reply NT msgId→OB11 id)。\n * 转换失败的元素原样保留(uid 未解析 / msgId 未映射——不阻塞上报)。\n */\nexport function applyReceiveContext(\n elements: CanonicalElement[],\n ctx: ReceiveTranslateContext,\n): CanonicalElement[] {\n if (ctx.uidToUin === undefined && ctx.msgIdToOb11Id === undefined) {\n return elements;\n }\n const out: CanonicalElement[] = [];\n for (const el of elements) {\n if (el.type === \"at\" && el.target !== \"all\") {\n const uin = ctx.uidToUin?.get(el.target);\n out.push(uin !== undefined ? { ...el, target: uin } : el);\n continue;\n }\n if (el.type === \"reply\") {\n const id = ctx.msgIdToOb11Id?.(el.messageId);\n out.push(id !== undefined ? { ...el, messageId: String(id) } : el);\n continue;\n }\n out.push(el);\n }\n return out;\n}\n\n/**\n * 发送方向翻译上下文(ID 空间转换,P2-19,2026-08-07)。\n * OB11 的 at.qq 是 uin、reply.id 是 OB11 message_id,canonical 需要 uid / NT msgId。\n */\nexport interface SendTranslateContext {\n /** uin → uid 映射(at 段目标转换;缺省不转换)。 */\n uinToUid?: Map<string, string>;\n /** OB11 message_id → NT msgId(reply 段转换;缺省原样透传)。 */\n ob11IdToMsgId?: (id: number) => string | undefined;\n}\n\n/** at 段:uin → uid(缺省不转换)。 */\nfunction translateAtElement(\n el: Extract<CanonicalElement, { type: \"at\" }>,\n ctx: SendTranslateContext,\n): CanonicalElement {\n const uid = ctx.uinToUid?.get(el.target);\n return uid !== undefined ? { ...el, target: uid } : el;\n}\n\n/** reply 段:OB11 message_id → NT msgId(反查不到原样透传)。 */\nfunction translateReplyElement(\n el: Extract<CanonicalElement, { type: \"reply\" }>,\n ctx: SendTranslateContext,\n): CanonicalElement {\n const num = Number(el.messageId);\n if (Number.isNaN(num)) {\n return el;\n }\n const msgId = ctx.ob11IdToMsgId?.(num);\n return msgId !== undefined ? { ...el, messageId: msgId } : el;\n}\n\n/**\n * canonical 元素数组 → 应用发送方向 ID 转换(at uin→uid、reply OB11 id→NT msgId)。\n * reply 反查不到时原样透传(兼容客户端直接给 NT msgId 的输入,不报错)。\n */\nexport function applySendContext(\n elements: CanonicalElement[],\n ctx: SendTranslateContext,\n): CanonicalElement[] {\n if (ctx.uinToUid === undefined && ctx.ob11IdToMsgId === undefined) {\n return elements;\n }\n const out: CanonicalElement[] = [];\n for (const el of elements) {\n if (el.type === \"at\" && el.target !== \"all\") {\n out.push(translateAtElement(el, ctx));\n continue;\n }\n if (el.type === \"reply\") {\n out.push(translateReplyElement(el, ctx));\n continue;\n }\n out.push(el);\n }\n return out;\n}\n\n/** CQ 码字符串 → OB11 segment 数组(未知 CQ 类型保留为 text 段原文)。 */\nexport function cqMessageToSegments(text: string): OB11MessageSegment[] {\n const segments: OB11MessageSegment[] = [];\n for (const part of parseCqMessage(text)) {\n if (typeof part === \"string\") {\n if (part.length > 0) {\n segments.push({ type: \"text\", data: { text: part } });\n }\n } else {\n const seg = cqCodeToSegment(part);\n if (seg !== null) {\n segments.push(seg);\n }\n }\n }\n return segments;\n}\n\n/** canonical 元素数组 → CQ 码字符串。 */\nexport function canonicalToCqMessage(elements: CanonicalElement[]): string {\n return segmentsToCqMessage(canonicalToSegments(elements));\n}\n\n/** CQ 码字符串 → canonical 元素数组。 */\nexport function cqMessageToCanonical(text: string): CanonicalElement[] {\n return segmentsToCanonical(cqMessageToSegments(text));\n}\n","/**\n * OB11 消息信息翻译(RawMessage → OB11 消息信息结构)\n *\n * get_msg / get_group_msg_history / get_friend_msg_history 返回项用。\n * 纯函数(ADR-008):只读入参,不调 API、不读缓存。\n * 与 adapter.ts 的 toOb11MessageEvent(事件格式,带 self_id/post_type)是两套结构,不复用。\n */\nimport type { RawMessage } from \"@napuketto/kernel\";\nimport { ChatType, toCanonicalElements } from \"@napuketto/kernel\";\nimport type { OB11MessageInfo } from \"../types/index.js\";\nimport {\n applyReceiveContext,\n canonicalToCqMessage,\n canonicalToSegments,\n type ReceiveTranslateContext,\n} from \"./data.js\";\nimport type { MessageUnique } from \"./message-unique.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/** RawMessage → OB11 消息信息(message_id 经 MessageUnique 映射)。\n * ctx(可选):接收方向 ID 转换上下文(at uid→uin、reply NT msgId→OB11 id,P2-19)。 */\nexport function toOb11MessageInfo(\n msg: RawMessage,\n unique: MessageUnique,\n ctx: ReceiveTranslateContext = {},\n): OB11MessageInfo {\n const elements = applyReceiveContext(toCanonicalElements(msg), ctx);\n let messageType: \"group\" | \"private\" = \"private\";\n if (msg.chatType === ChatType.GROUP) {\n messageType = \"group\";\n }\n const info: OB11MessageInfo = {\n message_id: unique.alloc(msg.msgId, {\n chatType: msg.chatType,\n peerUid: msg.peerUid,\n }),\n message_type: messageType,\n sender: {\n user_id: Number(msg.senderUin),\n nickname: msg.sendNickName,\n },\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n message: canonicalToSegments(elements),\n raw_message: canonicalToCqMessage(elements),\n };\n if (msg.chatType === ChatType.GROUP) {\n info.group_id = Number(msg.peerUid);\n const { sender } = info;\n // 发送者角色由调用方经 ctx 注入(GroupCache 查询在协议边界,翻译纯函数)\n sender.role = ctx.senderRole ?? \"member\";\n if (msg.sendMemberName !== undefined) {\n sender.card = msg.sendMemberName;\n }\n } else {\n // 2026-08-07 修复:user_id 应为发送者(senderUin),与消息事件一致。\n // 此前用 peerUin(会话对端)——机器人自己发的消息 user_id 会错成对端。\n info.user_id = Number(msg.senderUin);\n }\n return info;\n}\n","/**\n * OB11 notice 事件翻译(P2-7,2026-08-05;2026-09-08 T4 补全)\n *\n * NT QQ 中群成员变动/撤回等系统事件通过**消息的灰色提示元素(grayTip)**广播。\n * 本模块把 RawMessage 里的 grayTip 翻译为 OB11 notice 事件(纯函数,ADR-008)。\n *\n * 支持:\n * - group_recall(群撤回,grayTip.subElementType=REVOKE + chatType=GROUP)\n * - friend_recall(好友撤回,REVOKE + chatType=C2C,2026-09-08)\n * - group_increase / group_decrease(群成员变动,subElementType=GROUP + TipGroupElement.type)\n * - group_admin(管理员变更,TipGroupElement.type=BLOCK/UNBLOCK 的 role 语义)\n * - group_ban(禁言,TipGroupElement.type=SHUT_UP)\n * - notify.poke(戳一戳,aioOpGrayTipElement;⚠️ 待真实 poke 事件验证,2026-09-08)\n *\n * 未知/未翻译的 grayTip 子类型(JSON/BUDDY/ESSENCE/GROUP_NOTIFY 等)打 raw JSON\n * 日志(ctx.logger 可选)——为后续真实事件校准积累数据。\n *\n * user_id/operator_id 都是 uin:接收 uidToUin Map(调用方批量转换后传入,保持纯函数)。\n */\n\nimport type { BuddyListEntry } from \"@napuketto/kernel\";\nimport {\n ChatType,\n type GrayTipElement,\n GrayTipSubType,\n type RawMessage,\n type TipGroupElement,\n TipGroupElementType,\n} from \"@napuketto/kernel\";\n\nexport { collectGrayTipUids } from \"../../core/gray-tip.js\";\n\nimport { firstUntranslatedGrayTip } from \"../../core/gray-tip.js\";\n\nimport type {\n OB11Event,\n OB11FriendAddNoticeEvent,\n OB11FriendRecallNoticeEvent,\n OB11GroupAdminNoticeEvent,\n OB11GroupBanNoticeEvent,\n OB11GroupDecreaseNoticeEvent,\n OB11GroupIncreaseNoticeEvent,\n OB11GroupRecallNoticeEvent,\n OB11GroupUploadNoticeEvent,\n OB11NotifyNoticeEvent,\n} from \"../event/index.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/** 群文件业务类型(group_upload 的 file.busid,与 kernel 群文件系列同源语义)。 */\nconst GROUP_FILE_BUS_ID = 102;\n\n/** 检查消息是否含文件元素(group_upload 开关分支判定)。 */\nexport function hasFileElement(msg: RawMessage): boolean {\n return msg.elements.some((el) => el.fileElement !== undefined);\n}\n\n/** grayTip 翻译上下文(uid→uin 映射,调用方批量转换)。 */\nexport interface NoticeTranslateContext {\n selfUin: string;\n uidToUin: Map<string, string>;\n /** 校准日志(可选:未知 grayTip 子类型/poke raw JSON;缺省静默)。 */\n logger?: { warn(obj: unknown, msg?: string): void };\n}\n\n/** 检查消息是否含可翻译的 grayTip 元素。 */\nexport function hasGrayTip(msg: RawMessage): boolean {\n return msg.elements.some((el) => el.grayTipElement !== undefined);\n}\n\n/** uid → uin(上下文映射缺省退化为 uid)。 */\nfunction toUin(uid: string, ctx: NoticeTranslateContext): number {\n const uin = ctx.uidToUin.get(uid);\n return Number(uin ?? uid);\n}\n\n/** 基础字段(time/self_id/post_type)。 */\nfunction base(\n msg: RawMessage,\n ctx: NoticeTranslateContext,\n): {\n time: number;\n self_id: number;\n post_type: \"notice\";\n group_id: number;\n} {\n return {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n post_type: \"notice\",\n group_id: Number(msg.peerUid),\n };\n}\n\n/** 撤回事件(chatType 分流:GROUP→group_recall / C2C→friend_recall,2026-09-08)。 */\nfunction toRecall(\n msg: RawMessage,\n g: GrayTipElement,\n ctx: NoticeTranslateContext,\n): OB11GroupRecallNoticeEvent | OB11FriendRecallNoticeEvent | null {\n if (g?.revokeElement === undefined) {\n return null;\n }\n const revoke = g.revokeElement;\n if (msg.chatType === ChatType.C2C) {\n // 好友撤回:user_id = 撤回者,message_id = msgSeq\n return {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n post_type: \"notice\",\n notice_type: \"friend_recall\",\n user_id: toUin(revoke.operatorUid, ctx),\n message_id: Number(msg.msgSeq),\n };\n }\n return {\n ...base(msg, ctx),\n notice_type: \"group_recall\",\n user_id: toUin(revoke.operatorUid, ctx),\n operator_id: toUin(revoke.operatorUid, ctx),\n message_id: Number(msg.msgSeq),\n };\n}\n\n/**\n * 戳一戳(notify.poke,aioOpGrayTipElement,2026-09-08)。\n *\n * ⚠️ 待真实 poke 事件验证:aioOp 载荷的完整字段形状未经实测(实体类型仅有\n * operateType/peerUid 两个已证字段)。当前口径:user_id = 消息发送者,\n * target_id = aioOp.peerUid(C2C 即对端;群内为目标 uid 的假设待校准),\n * group_id = 群号(C2C 为 0)。poke 路径始终打 raw 日志积累校准数据。\n */\nfunction toPoke(\n msg: RawMessage,\n g: GrayTipElement,\n ctx: NoticeTranslateContext,\n): OB11NotifyNoticeEvent {\n const aioOp = g?.aioOpGrayTipElement;\n ctx.logger?.warn(\n { raw: JSON.stringify(g)?.slice(0, 2000) },\n \"ob11: poke grayTip raw(待真实事件校准)\",\n );\n const isGroup = msg.chatType === ChatType.GROUP;\n return {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n post_type: \"notice\",\n notice_type: \"notify\",\n sub_type: \"poke\",\n group_id: isGroup ? Number(msg.peerUid) : 0,\n user_id: toUin(msg.senderUid, ctx),\n target_id: toUin(aioOp?.peerUid ?? \"\", ctx),\n };\n}\n\n/** 群成员变动事件族(increase/decrease/admin/ban 的联合,映射器返回类型)。 */\ntype OB11GroupEvent =\n | OB11GroupIncreaseNoticeEvent\n | OB11GroupDecreaseNoticeEvent\n | OB11GroupAdminNoticeEvent\n | OB11GroupBanNoticeEvent;\n\n/** 群成员变动公共字段。 */\ninterface GroupChangeCommon {\n time: number;\n selfId: number;\n groupId: number;\n memberUid: string;\n adminUid: string;\n}\n\n/** 群成员变动映射器表(键 = TipGroupElementType;缺项 = 不可翻译返回 null)。 */\nconst GROUP_CHANGE_BUILDERS: Partial<\n Record<\n TipGroupElementType,\n (\n common: GroupChangeCommon,\n grp: TipGroupElement,\n ctx: NoticeTranslateContext,\n ) => OB11GroupEvent | null\n >\n> = {\n [TipGroupElementType.MEMBER_ADD]: toMemberAdd,\n [TipGroupElementType.QUIT]: toQuit,\n [TipGroupElementType.BLOCK]: toAdminChange,\n [TipGroupElementType.UNBLOCK]: toAdminChange,\n [TipGroupElementType.SHUT_UP]: toBan,\n};\n\n/** 群成员变动(group_increase / group_decrease / group_admin / group_ban)。 */\nfunction toGroupChange(\n msg: RawMessage,\n g: GrayTipElement,\n ctx: NoticeTranslateContext,\n): OB11GroupEvent | null {\n const grp = g?.groupElement;\n if (grp === undefined || grp.type === undefined) {\n return null;\n }\n const builder = GROUP_CHANGE_BUILDERS[grp.type];\n if (builder === undefined) {\n return null;\n }\n return builder(\n {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n selfId: Number(ctx.selfUin),\n groupId: Number(msg.peerUid),\n memberUid: grp.memberUid ?? \"\",\n adminUid: grp.adminUid ?? \"\",\n },\n grp,\n ctx,\n );\n}\n\n/** 群成员增加(approve=管理员操作 / invite=普通邀请)。 */\nfunction toMemberAdd(\n common: GroupChangeCommon,\n _grp: TipGroupElement,\n ctx: NoticeTranslateContext,\n): OB11GroupIncreaseNoticeEvent {\n const { time, selfId, groupId, memberUid, adminUid } = common;\n return {\n time,\n self_id: selfId,\n post_type: \"notice\",\n notice_type: \"group_increase\",\n sub_type: adminUid === memberUid ? \"approve\" : \"invite\",\n group_id: groupId,\n operator_id: toUin(adminUid, ctx),\n user_id: toUin(memberUid, ctx),\n };\n}\n\n/** 群成员退出(leave)。 */\nfunction toQuit(\n common: GroupChangeCommon,\n _grp: TipGroupElement,\n ctx: NoticeTranslateContext,\n): OB11GroupDecreaseNoticeEvent {\n const { time, selfId, groupId, memberUid, adminUid } = common;\n return {\n time,\n self_id: selfId,\n post_type: \"notice\",\n notice_type: \"group_decrease\",\n sub_type: \"leave\",\n group_id: groupId,\n operator_id: toUin(adminUid, ctx),\n user_id: toUin(memberUid, ctx),\n };\n}\n\n/** 管理员变更(BLOCK=set / UNBLOCK=unset)。 */\nfunction toAdminChange(\n common: GroupChangeCommon,\n grp: TipGroupElement,\n ctx: NoticeTranslateContext,\n): OB11GroupAdminNoticeEvent {\n const { time, selfId, groupId, memberUid, adminUid } = common;\n return {\n time,\n self_id: selfId,\n post_type: \"notice\",\n notice_type: \"group_admin\",\n sub_type: grp.type === TipGroupElementType.BLOCK ? \"set\" : \"unset\",\n group_id: groupId,\n user_id: toUin(memberUid === \"\" ? adminUid : memberUid, ctx),\n };\n}\n\n/** 禁言(duration>0=ban / 否则 lift_ban)。 */\nfunction toBan(\n common: GroupChangeCommon,\n grp: TipGroupElement,\n ctx: NoticeTranslateContext,\n): OB11GroupBanNoticeEvent {\n const shutUp = grp.shutUp;\n const duration = Number(shutUp?.duration ?? 0);\n return {\n time: common.time,\n self_id: common.selfId,\n post_type: \"notice\",\n notice_type: \"group_ban\",\n sub_type: duration > 0 ? \"ban\" : \"lift_ban\",\n group_id: common.groupId,\n operator_id: toUin(shutUp?.admin?.uid ?? common.adminUid, ctx),\n user_id: toUin(shutUp?.member?.uid ?? common.memberUid, ctx),\n duration,\n };\n}\n\n/**\n * 好友添加(friend_add,B2,2026-09-08)。\n * 数据源 = kernel BuddyCache 快照 diff(Buddy/onBuddyListChange 全量快照对比,\n * 首帧 baseline 不发)——非 grayTip 路径。user_id 取 coreInfo.uin(顶层 uin 兜底)。\n */\nexport function toFriendAdd(entry: BuddyListEntry, selfUin: string): OB11FriendAddNoticeEvent {\n const uin = entry.coreInfo?.uin ?? entry.uin ?? \"\";\n return {\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(selfUin),\n post_type: \"notice\",\n notice_type: \"friend_add\",\n user_id: Number(uin),\n };\n}\n\n/**\n * 群文件上传(group_upload,B4,2026-09-08)。\n * 数据源 = 含 fileElement 的群消息(开关 groupUploadAsNotice=true 时替代\n * message 事件报出)。file.id 取 fileUuid(缺省文件名)、size 取 fileSize、\n * busid 固定 102(群文件业务类型,与 kernel GROUP_FILE_BIZ_TYPE 同源语义)。\n */\nexport function toGroupUpload(msg: RawMessage, selfUin: string): OB11GroupUploadNoticeEvent | null {\n const el = msg.elements.find((e) => e.fileElement !== undefined);\n const file = el?.fileElement;\n if (file === undefined) {\n return null;\n }\n return {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n self_id: Number(selfUin),\n post_type: \"notice\",\n notice_type: \"group_upload\",\n group_id: Number(msg.peerUid),\n user_id: Number(msg.senderUin),\n file: {\n id: file.fileUuid ?? file.fileName ?? \"\",\n name: file.fileName ?? \"\",\n size: Number(file.fileSize ?? 0),\n busid: GROUP_FILE_BUS_ID,\n },\n };\n}\n\n/** 单个 grayTip 元素 → notice 事件(null = 不可翻译;未知子类型打 raw 日志)。 */\nfunction translateGrayTip(\n msg: RawMessage,\n g: GrayTipElement,\n ctx: NoticeTranslateContext,\n): OB11Event | null {\n const subType = g.subElementType;\n if (subType === GrayTipSubType.REVOKE) {\n return toRecall(msg, g, ctx);\n }\n if (subType === GrayTipSubType.GROUP) {\n return toGroupChange(msg, g, ctx);\n }\n if (g.aioOpGrayTipElement !== undefined) {\n // poke(aioOp):subElementType 归属未实证(BUDDY_NOTIFY/GROUP_NOTIFY 载荷),\n // 以元素存在性识别;始终打 raw 日志(toPoke 内)\n return toPoke(msg, g, ctx);\n }\n // 未知/未翻译子类型:raw 日志(JSON/BUDDY/ESSENCE/GROUP_NOTIFY/FILE 等——\n // friend_add/lucky_notify/honor/essence 等翻译的数据源校准入口)\n logUntranslatedGrayTip(msg, ctx);\n return null;\n}\n\n// 未知/未翻译子类型 raw 日志(与 Milky notice 同源,core 提取器定位元素)\nfunction logUntranslatedGrayTip(msg: RawMessage, ctx: NoticeTranslateContext): void {\n const untranslated = firstUntranslatedGrayTip(msg);\n if (untranslated !== undefined) {\n ctx.logger?.warn(\n {\n subType: untranslated.subElementType,\n raw: JSON.stringify(untranslated)?.slice(0, 2000),\n },\n \"ob11: 未翻译的 grayTip 子类型(raw 校准数据)\",\n );\n }\n}\n\n/** RawMessage → OB11 notice 事件(无 grayTip 返回 null)。\n * 未知/未翻译子类型打 raw JSON 日志(校准数据积累,2026-09-08)。 */\nexport function toOb11NoticeEvent(msg: RawMessage, ctx: NoticeTranslateContext): OB11Event | null {\n for (const el of msg.elements) {\n const g = el.grayTipElement;\n if (g === undefined) {\n continue;\n }\n const event = translateGrayTip(msg, g, ctx);\n if (event !== null) {\n return event;\n }\n }\n return null;\n}\n","/**\n * OB11 request 事件翻译(2026-09-08)\n *\n * 事件源(kernel 事件通道,本次接线):\n * - `Group/onGroupNotifiesUpdated`(GroupBridge,群系统通知推送)→ group_add / group_invite\n * - `Buddy/onBuddyReqChange`(FriendBridge,好友申请推送)→ friend\n *\n * flag 语义(与应答动作匹配路径一致):\n * - 群请求 flag = GroupNotify.seq(set_group_add_request 按 `item.seq === flag` 匹配)\n * - 好友请求 flag = BuddyReq.reqTime(set_friend_add_request 按 `reqTime === flag` 匹配)\n *\n * 纯函数(ADR-008):uid→uin 由调用方批量转换后传入。\n * ⚠️ onBuddyReqChange 回调参数形状未经真实事件校准(wrapper 字符串证据仅有方法名),\n * narrowBuddyReqs 防御性收窄,未知形状返回 null 由调用方打 raw 日志积累校准数据。\n */\n\nimport {\n type BuddyReq,\n type GroupNotify,\n GroupNotifyMsgStatus,\n GroupNotifyMsgType,\n} from \"@napuketto/kernel\";\nimport { MS_TO_SEC, type RequestTranslateContext, resolveUin } from \"../../core/uid-uin.js\";\n\nexport type { RequestTranslateContext } from \"../../core/uid-uin.js\";\n\nimport type { OB11FriendRequestEvent, OB11GroupRequestEvent } from \"../event/index.js\";\n\n/** uid → uin(core 共享解析;ctx 携带映射)。 */\nfunction toUin(uid: string | undefined, ctx: RequestTranslateContext): number {\n return resolveUin(uid, ctx.uidToUin);\n}\n\n/**\n * GroupNotify → OB11 群请求事件(group_add / group_invite)。\n *\n * type 语义与 get_group_system_msg 动作同一解释:1/5=邀请(invite)、7=申请(add);\n * 仅未处理状态(KUNHANDLE)推送——已处理通知重复推送不再发事件。\n * 非请求类通知(踢人/转让等处理结果回执)返回 null。\n */\nexport function toOb11GroupRequestEvent(\n notify: GroupNotify,\n ctx: RequestTranslateContext,\n): OB11GroupRequestEvent | null {\n if (notify.status !== GroupNotifyMsgStatus.KUNHANDLE) {\n return null;\n }\n let subType: \"add\" | \"invite\";\n switch (notify.type) {\n case GroupNotifyMsgType.INVITED_BY_MEMBER:\n case GroupNotifyMsgType.INVITED_NEED_ADMINI_STRATOR_PASS:\n subType = \"invite\";\n break;\n case GroupNotifyMsgType.REQUEST_JOIN_NEED_ADMINI_STRATOR_PASS:\n subType = \"add\";\n break;\n default:\n return null;\n }\n // user1 语义:invite=邀请人 / add=申请人(与 get_group_system_msg 的 invitor 口径一致)\n return {\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n post_type: \"request\",\n request_type: \"group\",\n sub_type: subType,\n group_id: Number(notify.group?.groupCode ?? 0),\n user_id: toUin(notify.user1?.uid, ctx),\n comment: notify.postscript ?? \"\",\n flag: String(notify.seq),\n };\n}\n\n/** BuddyReq 防御性收窄收敛到 core(OB11 / Milky 共用,P1 2026-10-30)。 */\nexport { isBuddyReqLike, narrowBuddyReqs } from \"../../core/buddy-req.js\";\n\n/**\n * BuddyReq → OB11 好友请求事件(friend)。\n * comment 取 words 字段(验证留言,形状待校准,缺省空串);flag = reqTime。\n */\nexport function toOb11FriendRequestEvent(\n req: BuddyReq,\n ctx: RequestTranslateContext,\n): OB11FriendRequestEvent {\n const words = req[\"words\"];\n return {\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n post_type: \"request\",\n request_type: \"friend\",\n user_id: toUin(req.friendUid, ctx),\n comment: typeof words === \"string\" ? words : \"\",\n flag: req.reqTime,\n };\n}\n","/**\n * get_forward_msg 动作:获取合并转发内容(P2-12 接 kernel MsgApi.fetchForwardMessage)\n *\n * message_id / id → 反查 msgId + peer → fetchForwardMessage(getMultiMsg)→\n * 每条 toOb11MessageInfo → { messages }。\n */\n\nimport { kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { toOb11MessageInfo } from \"../../helper/index.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getForwardMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]).optional(),\n id: z.union([z.number(), z.string()]).optional(),\n});\n\ntype GetForwardMsgPayload = z.infer<typeof getForwardMsgSchema>;\n\n/** 获取合并转发内容(P2-12 接 kernel fetchForwardMessage)。 */\nexport class GetForwardMsgAction extends BaseAction<\n GetForwardMsgPayload,\n { messages: OB11MessageInfo[] }\n> {\n readonly name = \"get_forward_msg\";\n readonly schema = getForwardMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"msgApi\" | \"messageUnique\">;\n\n constructor(deps: Pick<OneBotApi, \"msgApi\" | \"messageUnique\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(\n payload: GetForwardMsgPayload,\n ): Promise<{ messages: OB11MessageInfo[] }> {\n const id = payload.message_id ?? payload.id;\n if (id === undefined) {\n throw kernelError(\"get_forward_msg 需要 message_id 或 id\", \"INVALID_PARAM\");\n }\n const { msgId, peer } = resolveMsgIdAndPeer(id, this.deps.messageUnique);\n const msgs = await this.deps.msgApi.fetchForwardMessage(peer, msgId);\n return {\n messages: msgs.map((msg) => toOb11MessageInfo(msg, this.deps.messageUnique)),\n };\n }\n}\n","/**\n * 历史消息动作共享逻辑(get_friend_msg_history / get_group_msg_history 共用,2026-08-08 克隆合并)\n *\n * - resolveStartMsgId:message_seq(OB11 int32 或 NT msgId)→ 起始 msgId\n * - fetchAndTranslateHistory:拉取历史消息 → at uid 批量转换 → OB11 消息信息数组\n */\n\nimport { ChatType, kernelError, toCanonicalElements } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport {\n collectReceiveNeeds,\n type GroupSenderRole,\n type ReceiveTranslateContext,\n toOb11MessageInfo,\n} from \"../../helper/index.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\n\n/** 历史消息依赖(OneBotApi 视图,由装配方注入)。 */\nexport type MsgHistoryDeps = Pick<\n OneBotApi,\n \"msgApi\" | \"messageUnique\" | \"uidToUin\" | \"groupMemberRoles\"\n>;\n\n/** 默认历史消息条数。 */\nconst DEFAULT_HISTORY_COUNT = 20;\n\n/** 历史消息公共参数(message_seq / count / 反向排序)。 */\nexport const msgHistoryParamsSchema = {\n /** 起始消息序号(message_seq,缺省从最新拉)。 */\n message_seq: z.union([z.number(), z.string()]).optional(),\n count: z.number().default(DEFAULT_HISTORY_COUNT),\n /** 是否反向排序(NapCat 扩展)。 */\n reverse_order: z.boolean().optional(),\n reverseOrder: z.boolean().optional(),\n} as const;\n\n/** 解析 message_seq → 起始 msgId(int32 经 MessageUnique 反查,否则原样透传)。 */\nfunction resolveStartMsgId(\n messageSeq: number | string | undefined,\n messageUnique: MsgHistoryDeps[\"messageUnique\"],\n): string | undefined {\n if (messageSeq === undefined) {\n return undefined;\n }\n const raw = String(messageSeq);\n const shortId = Number(raw);\n if (Number.isFinite(shortId)) {\n return messageUnique.getMsgId(shortId) ?? raw;\n }\n return raw;\n}\n\n/**\n * 拉取历史消息并翻译为 OB11 消息信息数组。\n * 收集全部消息 at uid → 一次批量 uidToUin → 上下文注入(P2-19)。\n * 群聊另取发送者角色表(GroupCache 一次整表读取,失败回退缺省 member)。\n */\nexport async function fetchAndTranslateHistory(\n peer: { chatType: ChatType; peerUid: string },\n messageSeq: number | string | undefined,\n count: number,\n deps: MsgHistoryDeps,\n): Promise<{ messages: OB11MessageInfo[] }> {\n const startMsgId = resolveStartMsgId(messageSeq, deps.messageUnique);\n const opts: { count: number; msgId?: string } = { count };\n if (startMsgId !== undefined) {\n opts.msgId = startMsgId;\n }\n const msgs = await deps.msgApi.fetchMessages(peer, opts);\n if (msgs.length === 0) {\n throw kernelError(`消息 ${messageSeq ?? \"0\"} 不存在`, \"NOT_FOUND\");\n }\n // P2-19:收集全部消息 at uid → 一次批量 uidToUin → 上下文注入\n const atUids = new Set<string>();\n for (const m of msgs) {\n const { atUids: uids } = collectReceiveNeeds(toCanonicalElements(m));\n for (const u of uids) {\n atUids.add(u);\n }\n }\n let uidToUin: Map<string, string> | undefined;\n if (atUids.size > 0) {\n try {\n uidToUin = await deps.uidToUin([...atUids]);\n } catch {\n // uid 解析失败:at 原样(uid)\n }\n }\n const ctx: ReceiveTranslateContext = {\n ...(uidToUin !== undefined ? { uidToUin } : {}),\n msgIdToOb11Id: (m) => deps.messageUnique.getMessageId(m),\n };\n let senderRoles: Map<string, GroupSenderRole> | undefined;\n if (peer.chatType === ChatType.GROUP) {\n senderRoles = await deps.groupMemberRoles(peer.peerUid);\n }\n return {\n messages: msgs.map((msg) => {\n const role = senderRoles?.get(msg.senderUid);\n return toOb11MessageInfo(msg, deps.messageUnique, {\n ...ctx,\n ...(role !== undefined ? { senderRole: role } : {}),\n });\n }),\n };\n}\n","/**\n * get_friend_msg_history 动作:获取私聊历史消息(NapCat 扩展,P2-10)\n *\n * user_id → uin→uid → Peer{ C2C } → fetchMessages → 数组翻译。\n */\n\nimport { ChatType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\nimport {\n fetchAndTranslateHistory,\n type MsgHistoryDeps,\n msgHistoryParamsSchema,\n} from \"./msg-history.js\";\n\nconst getFriendMsgHistorySchema = z.object({\n user_id: z.number(),\n ...msgHistoryParamsSchema,\n});\n\ntype GetFriendMsgHistoryPayload = z.infer<typeof getFriendMsgHistorySchema>;\n\n/** 获取私聊历史消息(P2-10 接 kernel fetchMessages)。 */\nexport class GetFriendMsgHistoryAction extends BaseAction<\n GetFriendMsgHistoryPayload,\n { messages: OB11MessageInfo[] }\n> {\n readonly name = \"get_friend_msg_history\";\n readonly schema = getFriendMsgHistorySchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: MsgHistoryDeps & {\n uinToUid: (uins: string[]) => Promise<Map<string, string>>;\n };\n\n constructor(\n deps: MsgHistoryDeps & { uinToUid: (uins: string[]) => Promise<Map<string, string>> },\n ) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(\n payload: GetFriendMsgHistoryPayload,\n ): Promise<{ messages: OB11MessageInfo[] }> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n const peer = { chatType: ChatType.C2C, peerUid: uid };\n return await fetchAndTranslateHistory(peer, payload.message_seq, payload.count, this.deps);\n }\n}\n","/**\n * get_group_msg_history 动作:获取群历史消息(go-cqhttp 扩展,P2-10)\n *\n * group_id → Peer{ GROUP } → MsgApi.fetchMessages(message_seq 起,count 条)\n * → 数组翻译为 OB11 消息信息。\n */\n\nimport { ChatType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport {\n fetchAndTranslateHistory,\n type MsgHistoryDeps,\n msgHistoryParamsSchema,\n} from \"./msg-history.js\";\n\nconst getGroupMsgHistorySchema = z.object({\n group_id: z.number(),\n ...msgHistoryParamsSchema,\n});\n\ntype GetGroupMsgHistoryPayload = z.infer<typeof getGroupMsgHistorySchema>;\n\n/** 获取群历史消息(P2-10 接 kernel fetchMessages)。 */\nexport class GetGroupMsgHistoryAction extends BaseAction<\n GetGroupMsgHistoryPayload,\n { messages: OB11MessageInfo[] }\n> {\n readonly name = \"get_group_msg_history\";\n readonly schema = getGroupMsgHistorySchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: MsgHistoryDeps;\n\n constructor(deps: MsgHistoryDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(\n payload: GetGroupMsgHistoryPayload,\n ): Promise<{ messages: OB11MessageInfo[] }> {\n const peer = { chatType: ChatType.GROUP, peerUid: String(payload.group_id) };\n return await fetchAndTranslateHistory(peer, payload.message_seq, payload.count, this.deps);\n }\n}\n","/**\n * get_image / get_record 动作:获取图片/语音文件(P2-14;2026-09-08 T5 接主动下载;\n * 2026-09-08 B1 语音接原生 downloadRichMedia)\n *\n * message_id 反查 → fetchMsgsByMsgId → 找 PIC/PTT 元素:\n * - 本地文件解析:NT 相对路径(sourcePath/filePath)按 mediaBaseDir(QQ NT\n * global 目录)解析为绝对路径,命中磁盘即返回 file\n * - 图片主动下载:本地未命中且有 picUrl → @napuketto/media downloadUrl 落\n * cacheDir/media/,返回 file(绝对路径)+ url + file_size/file_name\n * - 语音主动下载(B1):本地未命中 → kernel MsgApi.downloadPtt(原生\n * downloadRichMedia + 轮询元素回查)→ filePath 落盘后返回绝对路径;\n * 失败回退原始 filePath(NT 相对/绝对)+ 元数据,不抛错\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { kernelError, type RawElement } from \"@napuketto/kernel\";\nimport { downloadUrl, inferExtension } from \"@napuketto/media\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getMediaSchema = z.object({\n /** CQ 码 file 字段或 message_id(简化:message_id 反查)。 */\n file: z.string().optional(),\n message_id: z.union([z.number(), z.string()]).optional(),\n});\n\ntype GetMediaPayload = z.infer<typeof getMediaSchema>;\n\n/** 媒体信息返回。 */\nexport interface MediaInfoResult {\n file?: string;\n url?: string;\n file_size?: string;\n file_name?: string;\n base64?: string;\n}\n\n/** 媒体动作依赖(OneBotApi 视图)。 */\nexport type GetMediaDeps = Pick<\n OneBotApi,\n \"msgApi\" | \"messageUnique\" | \"cacheDir\" | \"mediaBaseDir\"\n>;\n\n/**\n * NT 相对路径 → 本地绝对路径(存在才返回)。\n * 候选:原样绝对路径 / mediaBaseDir 下相对路径(反斜杠归一化)。\n */\nexport function resolveLocalMediaFile(\n relPath: string,\n deps: { mediaBaseDir?: string | undefined },\n): string | null {\n if (relPath === \"\") {\n return null;\n }\n if (existsSync(relPath)) {\n return relPath;\n }\n const base = deps.mediaBaseDir;\n if (base !== undefined && base !== \"\") {\n const joined = join(base, relPath.replaceAll(\"\\\\\", \"/\"));\n if (existsSync(joined)) {\n return joined;\n }\n }\n return null;\n}\n\n/** 图片主动下载(picUrl → cacheDir/media/<uuid>.<ext>;无 cacheDir/url 返回 null)。 */\nasync function downloadImageToCache(\n url: string,\n deps: Pick<GetMediaDeps, \"cacheDir\">,\n): Promise<string | null> {\n const cacheDir = deps.cacheDir;\n if (cacheDir === undefined || cacheDir === \"\") {\n return null;\n }\n const mediaDir = join(cacheDir, \"media\");\n const { mkdir } = await import(\"node:fs/promises\");\n await mkdir(mediaDir, { recursive: true });\n const dest = join(mediaDir, `${randomUUID()}${inferExtension(null, url)}`);\n try {\n await downloadUrl(url, dest);\n return dest;\n } catch {\n return null;\n }\n}\n\n/**\n * 反查消息并提取媒体元素路径。\n * 返回 null = 消息不存在;extract 返回 undefined = 无匹配元素。\n */\nasync function resolveMedia(\n id: number | string,\n label: string,\n deps: GetMediaDeps,\n extract: (element: RawElement) => MediaInfoResult | undefined,\n): Promise<MediaInfoResult> {\n const { msgId, peer } = resolveMsgIdAndPeer(id, deps.messageUnique);\n const msgs = await deps.msgApi.fetchMsgsByMsgId(peer, [msgId]);\n const [first] = msgs;\n if (first === undefined) {\n throw kernelError(`消息 ${id} 不存在或已被撤回`, \"NOT_FOUND\");\n }\n for (const el of first.elements) {\n const found = extract(el);\n if (found !== undefined) {\n return found;\n }\n }\n throw kernelError(`消息 ${id} 不包含${label}`, \"NOT_FOUND\");\n}\n\n/** 取 id 参数(message_id 优先,file 兜底)。 */\nfunction takeId(payload: GetMediaPayload, actionName: string): number | string {\n const id = payload.message_id ?? payload.file;\n if (id === undefined) {\n throw kernelError(`${actionName} 需要 message_id 或 file`, \"INVALID_PARAM\");\n }\n return id;\n}\n\n/** 获取图片信息(本地优先,picUrl 主动下载兜底)。 */\nexport class GetImageAction extends BaseAction<GetMediaPayload, MediaInfoResult> {\n readonly name = \"get_image\";\n readonly schema = getMediaSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: GetMediaDeps;\n\n constructor(deps: GetMediaDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetMediaPayload): Promise<MediaInfoResult> {\n const id = takeId(payload, \"get_image\");\n const base = await resolveMedia(id, \"图片\", this.deps, (el) => {\n const pic = el.picElement;\n if (pic === undefined) {\n return undefined;\n }\n const out: MediaInfoResult = {};\n if (pic.fileSize !== undefined) {\n out.file_size = pic.fileSize;\n }\n if (pic.fileName !== undefined) {\n out.file_name = pic.fileName;\n }\n if (pic.picUrl !== undefined) {\n out.url = pic.picUrl;\n }\n const rel = pic.sourcePath ?? pic.picPath;\n if (rel !== undefined) {\n const local = resolveLocalMediaFile(rel, this.deps);\n if (local !== null) {\n out.file = local;\n }\n }\n return out;\n });\n // 本地未命中且有 URL → 主动下载到缓存目录\n if (base.file === undefined && base.url !== undefined) {\n const downloaded = await downloadImageToCache(base.url, this.deps);\n if (downloaded !== null) {\n base.file = downloaded;\n }\n }\n return base;\n }\n}\n\n/** 获取语音信息(本地优先;未命中走原生 downloadRichMedia,失败回退原始路径)。 */\nexport class GetRecordAction extends BaseAction<GetMediaPayload, MediaInfoResult> {\n readonly name = \"get_record\";\n readonly schema = getMediaSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: GetMediaDeps;\n\n constructor(deps: GetMediaDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetMediaPayload): Promise<MediaInfoResult> {\n const id = takeId(payload, \"get_record\");\n const { msgId, peer } = resolveMsgIdAndPeer(id, this.deps.messageUnique);\n const msgs = await this.deps.msgApi.fetchMsgsByMsgId(peer, [msgId]);\n const [first] = msgs;\n if (first === undefined) {\n throw kernelError(`消息 ${id} 不存在或已被撤回`, \"NOT_FOUND\");\n }\n const el = first.elements.find((e) => e.pttElement !== undefined);\n const ptt = el?.pttElement;\n if (ptt === undefined || ptt.filePath === undefined) {\n throw kernelError(`消息 ${id} 不包含语音`, \"NOT_FOUND\");\n }\n const meta = (): MediaInfoResult => ({\n ...(ptt.fileSize !== undefined ? { file_size: ptt.fileSize } : {}),\n ...(ptt.fileName !== undefined ? { file_name: ptt.fileName } : {}),\n });\n const local = resolveLocalMediaFile(ptt.filePath, this.deps);\n if (local !== null) {\n return { ...meta(), file: local };\n }\n // 本地未命中 → 原生下载(downloadRichMedia + 元素回查;失败回退原始路径)\n try {\n const downloaded = await this.deps.msgApi.downloadPtt(msgId, peer);\n const rel = downloaded.filePath;\n if (rel !== undefined && rel !== \"\") {\n const localAfter = resolveLocalMediaFile(rel, this.deps);\n if (localAfter !== null) {\n return {\n ...(downloaded.fileSize !== undefined\n ? { file_size: downloaded.fileSize }\n : {}),\n ...(downloaded.fileName !== undefined\n ? { file_name: downloaded.fileName }\n : {}),\n file: localAfter,\n };\n }\n }\n } catch {\n // 下载失败:回退现状(原始路径 + 元数据,不抛错)\n }\n return { ...meta(), file: ptt.filePath };\n }\n}\n","/**\n * get_msg 动作:获取消息详情(P2-10 接 kernel MsgApi.fetchMsgsByMsgId)\n *\n * message_id → msgId + peer(MessageUnique 反查)→ 拉消息 → OB11 消息信息结构。\n */\n\nimport { ChatType, toCanonicalElements } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport {\n collectReceiveNeeds,\n type ReceiveTranslateContext,\n toOb11MessageInfo,\n} from \"../../helper/index.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { fetchMsgById } from \"./resolve-peer.js\";\n\nconst getMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\ntype GetMsgPayload = z.infer<typeof getMsgSchema>;\n\n/** get_msg 依赖(OneBotApi 视图,由装配方注入)。 */\nexport type GetMsgDeps = Pick<\n OneBotApi,\n \"msgApi\" | \"messageUnique\" | \"uidToUin\" | \"groupMemberRole\"\n>;\n\n/** 获取消息详情(P2-10 接 kernel fetchMsgsByMsgId)。 */\nexport class GetMsgAction extends BaseAction<GetMsgPayload, OB11MessageInfo> {\n readonly name = \"get_msg\";\n readonly schema = getMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: GetMsgDeps;\n\n constructor(deps: GetMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetMsgPayload): Promise<OB11MessageInfo> {\n const { msg } = await fetchMsgById(\n payload.message_id,\n this.deps.messageUnique,\n this.deps.msgApi,\n );\n // P2-19:收集 at uid → 批量 uidToUin → 上下文注入(at uid→uin、reply 映射)\n const elements = toCanonicalElements(msg);\n const { atUids } = collectReceiveNeeds(elements);\n let uidToUin: Map<string, string> | undefined;\n if (atUids.length > 0) {\n try {\n uidToUin = await this.deps.uidToUin(atUids);\n } catch {\n // uid 解析失败:at 原样(uid)\n }\n }\n // 群消息查发送者角色(GroupCache 缓存优先;失败回退缺省 member)\n const senderRole =\n msg.chatType === ChatType.GROUP\n ? await this.deps.groupMemberRole(msg.peerUid, msg.senderUid)\n : undefined;\n const ctx: ReceiveTranslateContext = {\n ...(uidToUin !== undefined ? { uidToUin } : {}),\n ...(senderRole !== undefined ? { senderRole } : {}),\n msgIdToOb11Id: (m) => this.deps.messageUnique.getMessageId(m),\n };\n return toOb11MessageInfo(msg, this.deps.messageUnique, ctx);\n }\n}\n","/**\n * mark_msg_as_read 动作:标记消息已读(P2-10 接 kernel MsgApi.markRead)\n *\n * OB11 标准 mark_msg_as_read 以 user_id 为参数;NapCat 扩展同时支持 group_id\n * (mark_private_msg_as_read / mark_group_msg_as_read 由 adapter 层同名动作或\n * 语义别名处理)。user_id → C2C peer;group_id → GROUP peer。\n */\n\nimport { ChatType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst markMsgAsReadSchema = z\n .object({\n user_id: z.number().optional(),\n group_id: z.number().optional(),\n })\n .refine((v) => v.user_id !== undefined || v.group_id !== undefined, {\n message: \"mark_msg_as_read 需要 user_id 或 group_id\",\n });\n\ntype MarkMsgAsReadPayload = z.infer<typeof markMsgAsReadSchema>;\n\n/** 标记已读依赖(OneBotApi 视图,由装配方注入)。 */\nexport type MarkReadDeps = Pick<OneBotApi, \"msgApi\" | \"uinToUid\">;\n\n/** 标记消息已读(P2-10 接 kernel markRead)。 */\nexport class MarkMsgAsReadAction extends BaseAction<MarkMsgAsReadPayload, null> {\n readonly name = \"mark_msg_as_read\";\n readonly schema = markMsgAsReadSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: MarkReadDeps;\n\n constructor(deps: MarkReadDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: MarkMsgAsReadPayload): Promise<null> {\n if (payload.group_id !== undefined) {\n await this.deps.msgApi.markRead({\n chatType: ChatType.GROUP,\n peerUid: String(payload.group_id),\n });\n return null;\n }\n if (payload.user_id !== undefined) {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n await this.deps.msgApi.markRead({ chatType: ChatType.C2C, peerUid: uid });\n }\n return null;\n }\n}\n","/**\n * mark_private_msg_as_read / mark_group_msg_as_read 动作:标记会话已读(P2-13)\n *\n * mark_msg_as_read 的细分别名(NapCat 扩展):\n * - mark_private_msg_as_read:user_id → C2C markRead\n * - mark_group_msg_as_read:group_id → GROUP markRead\n */\n\nimport { ChatType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst markPrivateMsgAsReadSchema = z.object({\n user_id: z.number(),\n});\n\ntype MarkPrivateMsgAsReadPayload = z.infer<typeof markPrivateMsgAsReadSchema>;\n\nconst markGroupMsgAsReadSchema = z.object({\n group_id: z.number(),\n});\n\ntype MarkGroupMsgAsReadPayload = z.infer<typeof markGroupMsgAsReadSchema>;\n\n/** 标记已读依赖(msgApi + uinToUid,OneBotApi 视图)。 */\nexport type MarkReadAliasDeps = Pick<OneBotApi, \"msgApi\" | \"uinToUid\">;\n\n/** 标记私聊已读(P2-13)。 */\nexport class MarkPrivateMsgAsReadAction extends BaseAction<MarkPrivateMsgAsReadPayload, null> {\n readonly name = \"mark_private_msg_as_read\";\n readonly schema = markPrivateMsgAsReadSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: MarkReadAliasDeps;\n\n constructor(deps: MarkReadAliasDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: MarkPrivateMsgAsReadPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n await this.deps.msgApi.markRead({ chatType: ChatType.C2C, peerUid: uid });\n return null;\n }\n}\n\n/** 标记群聊已读(P2-13)。 */\nexport class MarkGroupMsgAsReadAction extends BaseAction<MarkGroupMsgAsReadPayload, null> {\n readonly name = \"mark_group_msg_as_read\";\n readonly schema = markGroupMsgAsReadSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"msgApi\">;\n\n constructor(deps: Pick<OneBotApi, \"msgApi\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: MarkGroupMsgAsReadPayload): Promise<null> {\n await this.deps.msgApi.markRead({\n chatType: ChatType.GROUP,\n peerUid: String(payload.group_id),\n });\n return null;\n }\n}\n","/**\n * send_group_forward_msg / send_private_forward_msg 动作:发送合并转发(P2-12)\n *\n * messages 每项为 node 元素 `{ type: \"node\", data: { id } }`——id 是此前\n * send_msg 返回的 OB11 message_id。经 MessageUnique 反查源 msgId + peer,\n * 组装到目标 peer(群直通 / 私聊 uinToUid)→ MsgApi.sendForwardMessage。\n */\n\nimport { ChatType, kernelError, type Peer } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport type { MessageUnique } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst forwardNodeSchema = z.object({\n type: z.literal(\"node\").optional(),\n data: z\n .object({\n id: z.union([z.number(), z.string()]),\n })\n .optional(),\n});\n\nconst sendGroupForwardMsgSchema = z.object({\n group_id: z.number(),\n messages: z.array(z.unknown()).default([]),\n});\n\ntype SendGroupForwardMsgPayload = z.infer<typeof sendGroupForwardMsgSchema>;\n\nconst sendPrivateForwardMsgSchema = z.object({\n user_id: z.number(),\n messages: z.array(z.unknown()).default([]),\n});\n\ntype SendPrivateForwardMsgPayload = z.infer<typeof sendPrivateForwardMsgSchema>;\n\n/** 合并转发依赖(OneBotApi 视图,由装配方注入)。 */\nexport type ForwardMsgDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\" | \"uinToUid\">;\n\n/** 解析 node 元素列表 → 源消息 (msgId, peer) 列表(id 反查,跳过无法解析的项)。 */\nfunction resolveSourceMessages(\n messages: unknown[],\n unique: MessageUnique,\n): Array<{ msgId: string; peer: Peer }> {\n const out: Array<{ msgId: string; peer: Peer }> = [];\n for (const raw of messages) {\n const parsed = forwardNodeSchema.safeParse(raw);\n if (parsed.success) {\n const id = parsed.data.data?.id;\n if (id !== undefined) {\n const msgId = unique.getMsgId(Number(id));\n if (msgId !== undefined) {\n const peer = unique.getPeer(msgId);\n if (peer !== undefined) {\n out.push({ msgId, peer });\n }\n }\n }\n }\n }\n return out;\n}\n\n/** 合并转发发送(群/私聊共用:解析源消息 → 发送 → 映射 message_id)。 */\nasync function sendForward(\n messages: unknown[],\n target: Peer,\n deps: ForwardMsgDeps,\n): Promise<{ message_id: number }> {\n const sources = resolveSourceMessages(messages, deps.messageUnique);\n const [firstSource] = sources;\n if (firstSource === undefined) {\n throw kernelError(\"合并转发需要至少一条可解析的源消息(node.id)\", \"INVALID_PARAM\");\n }\n const { msgId } = await deps.msgApi.sendForwardMessage(\n target,\n firstSource.peer,\n sources.map((s) => s.msgId),\n );\n return { message_id: deps.messageUnique.alloc(msgId, target) };\n}\n\n/** 发送群合并转发(P2-12 接 kernel sendForwardMessage)。 */\nexport class SendGroupForwardMsgAction extends BaseAction<\n SendGroupForwardMsgPayload,\n { message_id: number }\n> {\n readonly name = \"send_group_forward_msg\";\n readonly schema = sendGroupForwardMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: ForwardMsgDeps;\n\n constructor(deps: ForwardMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SendGroupForwardMsgPayload): Promise<{ message_id: number }> {\n const target: Peer = { chatType: ChatType.GROUP, peerUid: String(payload.group_id) };\n return await sendForward(payload.messages, target, this.deps);\n }\n}\n\n/** 发送私聊合并转发(P2-12)。 */\nexport class SendPrivateForwardMsgAction extends BaseAction<\n SendPrivateForwardMsgPayload,\n { message_id: number }\n> {\n readonly name = \"send_private_forward_msg\";\n readonly schema = sendPrivateForwardMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: ForwardMsgDeps;\n\n constructor(deps: ForwardMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(\n payload: SendPrivateForwardMsgPayload,\n ): Promise<{ message_id: number }> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n const target: Peer = { chatType: ChatType.C2C, peerUid: uid };\n return await sendForward(payload.messages, target, this.deps);\n }\n}\n","/**\n * send_msg 动作:发送消息(群聊/私聊)+ 共享发送核心 sendOb11Message\n *\n * P2-3 真实化:注入 kernel MsgApi,message 参数(CQ 码字符串或 segment 数组)\n * 翻译为 canonical 元素 → MsgApi.sendMessage → 返回真实 message_id。\n * send_private_msg / send_group_msg 复用 sendOb11Message(P2-10)。\n *\n * 群聊:group_id → Peer{ chatType: GROUP, peerUid: String(group_id) }(群消息 peerUid=群号)。\n * 私聊:user_id 经 uin→uid → Peer{ chatType: C2C, peerUid: uid }。\n */\n\nimport type { CanonicalElement } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction, ensureSilk } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { applySendContext, cqMessageToCanonical, segmentsToCanonical } from \"../../helper/index.js\";\nimport type { OB11MessageSegment } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveTargetPeer } from \"./resolve-peer.js\";\n\nconst sendMsgSchema = z.object({\n message_type: z.enum([\"group\", \"private\"]).optional(),\n user_id: z.number().optional(),\n group_id: z.number().optional(),\n message: z.union([z.string(), z.array(z.unknown())]),\n auto_escape: z.boolean().optional(),\n});\n\nexport type SendMsgPayload = z.infer<typeof sendMsgSchema>;\n\n/** send_msg 依赖(OneBotApi 视图,由装配方注入)。 */\nexport type SendMsgDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\" | \"uinToUid\">;\n\n/** 共享发送核心:解析 Peer → canonical 翻译(含 auto_escape)→ sendMessage → 映射 message_id。 */\nexport async function sendOb11Message(\n payload: SendMsgPayload,\n deps: SendMsgDeps,\n): Promise<{ message_id: number }> {\n const peer = await resolveTargetPeer(payload, deps, \"send_msg 需要 group_id 或 user_id\");\n // message: CQ 码字符串 → canonical;segment 数组 → canonical\n let canonical: CanonicalElement[];\n if (Array.isArray(payload.message)) {\n canonical = segmentsToCanonical(payload.message as OB11MessageSegment[]);\n } else {\n canonical = cqMessageToCanonical(payload.message);\n }\n // P2-19 发送方向 ID 转换:at.qq 是 uin → uid(一次批量 uinToUid);\n // reply.id 是 OB11 message_id → NT msgId(MessageUnique 反查,反查不到原样透传)\n const atUins: string[] = [];\n for (const el of canonical) {\n if (el.type === \"at\" && el.target !== \"all\") {\n atUins.push(el.target);\n }\n }\n let uinToUid: Map<string, string> | undefined;\n if (atUins.length > 0) {\n try {\n uinToUid = await deps.uinToUid(atUins);\n } catch {\n // uin 解析失败:at 原样(uin),交给 QQ 端判断\n }\n }\n canonical = applySendContext(canonical, {\n ...(uinToUid !== undefined ? { uinToUid } : {}),\n ob11IdToMsgId: (id) => deps.messageUnique.getMsgId(id),\n });\n // auto_escape:文本段转义 CQ 特殊字符\n if (payload.auto_escape === true) {\n canonical = canonical.map((el) => {\n if (el.type === \"text\") {\n return { ...el, text: escapeText(el.text) };\n }\n return el;\n });\n }\n // 语音段:非 silk 输入转 silk(QQ 语音协议);转换在协议层完成,kernel 不背 media(红线)\n canonical = await ensureVoiceSilk(canonical);\n const { msgId } = await deps.msgApi.sendMessage(peer, canonical);\n return { message_id: deps.messageUnique.alloc(msgId, peer) };\n}\n\n/** 发送消息(P2-3 接 kernel apis/msg,返回真实 message_id)。 */\nexport class SendMsgAction extends BaseAction<SendMsgPayload, { message_id: number }> {\n readonly name = \"send_msg\";\n readonly schema = sendMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SendMsgDeps;\n\n constructor(deps: SendMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected _handle(payload: SendMsgPayload): Promise<{ message_id: number }> {\n return sendOb11Message(payload, this.deps);\n }\n}\n\n/** CQ 特殊字符转义(auto_escape,&、[、]、, 前置 &amp;)。 */\nfunction escapeText(text: string): string {\n return text\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"[\", \"&#91;\")\n .replaceAll(\"]\", \"&#93;\")\n .replaceAll(\",\", \"&#44;\");\n}\n\n/** 语音元素统一转 silk:非 silk 自动转码(QQ 语音格式),已是 silk 原样。 */\nasync function ensureVoiceSilk(elements: CanonicalElement[]): Promise<CanonicalElement[]> {\n const out: CanonicalElement[] = [];\n for (const el of elements) {\n if (el.type === \"voice\") {\n out.push({ ...el, path: await ensureSilk(el.path) });\n } else {\n out.push(el);\n }\n }\n return out;\n}\n","/**\n * send_group_msg 动作:发送群聊消息(复用 sendOb11Message 核心)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport type { SendMsgDeps } from \"./send-msg.js\";\nimport { sendOb11Message } from \"./send-msg.js\";\n\nconst sendGroupMsgSchema = z.object({\n group_id: z.number(),\n message: z.union([z.string(), z.array(z.unknown())]),\n auto_escape: z.boolean().optional(),\n});\n\ntype SendGroupMsgPayload = z.infer<typeof sendGroupMsgSchema>;\n\n/** 发送群聊消息(P2-10 复用 sendOb11Message)。 */\nexport class SendGroupMsgAction extends BaseAction<SendGroupMsgPayload, { message_id: number }> {\n readonly name = \"send_group_msg\";\n readonly schema = sendGroupMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SendMsgDeps;\n\n constructor(deps: SendMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected _handle(payload: SendGroupMsgPayload): Promise<{ message_id: number }> {\n return sendOb11Message(payload, this.deps);\n }\n}\n","/**\n * send_private_msg 动作:发送私聊消息(复用 sendOb11Message 核心)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport type { SendMsgDeps } from \"./send-msg.js\";\nimport { sendOb11Message } from \"./send-msg.js\";\n\nconst sendPrivateMsgSchema = z.object({\n user_id: z.number(),\n message: z.union([z.string(), z.array(z.unknown())]),\n auto_escape: z.boolean().optional(),\n});\n\ntype SendPrivateMsgPayload = z.infer<typeof sendPrivateMsgSchema>;\n\n/** 发送私聊消息(P2-10 复用 sendOb11Message)。 */\nexport class SendPrivateMsgAction extends BaseAction<\n SendPrivateMsgPayload,\n { message_id: number }\n> {\n readonly name = \"send_private_msg\";\n readonly schema = sendPrivateMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SendMsgDeps;\n\n constructor(deps: SendMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected _handle(payload: SendPrivateMsgPayload): Promise<{ message_id: number }> {\n return sendOb11Message(payload, this.deps);\n }\n}\n","/**\n * set_input_status 动作:发送输入状态(NapCat 扩展,P2-11)\n *\n * user_id → uinToUid → MsgApi.setInputStatus(peer, eventType)。\n * eventType:1=输入中,0=停止输入。\n */\n\nimport { ChatType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst setInputStatusSchema = z.object({\n user_id: z.number(),\n /** 输入事件类型:1=输入中,0=停止。 */\n event_type: z.number().optional(),\n});\n\ntype SetInputStatusPayload = z.infer<typeof setInputStatusSchema>;\n\n/** 输入中事件类型。 */\nconst EVENT_TYPE_TYPING = 1;\n\n/** set_input_status 依赖(OneBotApi 视图)。 */\nexport type SetInputStatusDeps = Pick<OneBotApi, \"msgApi\" | \"uinToUid\">;\n\n/** 发送输入状态(P2-11 接 kernel setInputStatus)。 */\nexport class SetInputStatusAction extends BaseAction<SetInputStatusPayload, null> {\n readonly name = \"set_input_status\";\n readonly schema = setInputStatusSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SetInputStatusDeps;\n\n constructor(deps: SetInputStatusDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SetInputStatusPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n await this.deps.msgApi.setInputStatus(\n { chatType: ChatType.C2C, peerUid: uid },\n payload.event_type ?? EVENT_TYPE_TYPING,\n );\n return null;\n }\n}\n","/**\n * set_msg_emoji_like 动作:消息表情表态(NapCat 扩展,P2-10)\n *\n * message_id → msgId + peer → 拉消息取 msgSeq → MsgApi.setMsgEmojiLike。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { fetchMsgById } from \"./resolve-peer.js\";\n\nconst setMsgEmojiLikeSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n /** 表情 ID(如 105 点赞)。 */\n emoji_id: z.number(),\n /** 表情类型(默认 1)。 */\n emoji_type: z.number().optional(),\n /** 是否点赞(false 取消)。 */\n like: z.boolean().optional(),\n});\n\ntype SetMsgEmojiLikePayload = z.infer<typeof setMsgEmojiLikeSchema>;\n\n/** 表情表态依赖(OneBotApi 视图,由装配方注入)。 */\nexport type SetMsgEmojiLikeDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\">;\n\n/** 消息表情表态(P2-10 接 kernel setMsgEmojiLike)。 */\nexport class SetMsgEmojiLikeAction extends BaseAction<SetMsgEmojiLikePayload, null> {\n readonly name = \"set_msg_emoji_like\";\n readonly schema = setMsgEmojiLikeSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SetMsgEmojiLikeDeps;\n\n constructor(deps: SetMsgEmojiLikeDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SetMsgEmojiLikePayload): Promise<null> {\n const { msg, peer } = await fetchMsgById(\n payload.message_id,\n this.deps.messageUnique,\n this.deps.msgApi,\n );\n await this.deps.msgApi.setMsgEmojiLike(peer, {\n msgSeq: msg.msgSeq,\n emojiId: String(payload.emoji_id),\n emojiType: String(payload.emoji_type ?? 1),\n like: payload.like ?? true,\n });\n return null;\n }\n}\n","/**\n * can_send_image 动作:是否可以发送图片(本地 true,P2-11)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst canSendImageSchema = z.object({});\n\ntype CanSendImagePayload = z.infer<typeof canSendImageSchema>;\n\n/** 是否可以发送图片(本地 true,P2-11)。 */\nexport class CanSendImageAction extends BaseAction<CanSendImagePayload, { yes: boolean }> {\n readonly name = \"can_send_image\";\n readonly schema = canSendImageSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n protected _handle(_payload: CanSendImagePayload): Promise<{ yes: boolean }> {\n return Promise.resolve({ yes: true });\n }\n}\n","/**\n * can_send_record 动作:是否可以发送语音(本地 true,P2-11)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst canSendRecordSchema = z.object({});\n\ntype CanSendRecordPayload = z.infer<typeof canSendRecordSchema>;\n\n/** 是否可以发送语音(本地 true,P2-11)。 */\nexport class CanSendRecordAction extends BaseAction<CanSendRecordPayload, { yes: boolean }> {\n readonly name = \"can_send_record\";\n readonly schema = canSendRecordSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n protected _handle(_payload: CanSendRecordPayload): Promise<{ yes: boolean }> {\n return Promise.resolve({ yes: true });\n }\n}\n","/**\n * clean_cache 动作:清理缓存(本地组装,P2-11)\n *\n * cleanCache 回调由装配方注入(boot.cjs 接 kernel PathWrapper.clearCache)。\n * 未配置时明确报错(不静默)。\n */\n\nimport { kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst cleanCacheSchema = z.object({});\n\ntype CleanCachePayload = z.infer<typeof cleanCacheSchema>;\n\n/** clean_cache 依赖(cleanCache 回调由装配方注入,OneBotApi 视图)。 */\nexport type CleanCacheDeps = Pick<OneBotApi, \"cleanCache\">;\n\n/** 清理缓存(P2-11)。 */\nexport class CleanCacheAction extends BaseAction<CleanCachePayload, null> {\n readonly name = \"clean_cache\";\n readonly schema = cleanCacheSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: CleanCacheDeps;\n\n constructor(deps: CleanCacheDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(_payload: CleanCachePayload): Promise<null> {\n if (this.deps.cleanCache === undefined) {\n throw kernelError(\"clean_cache 未配置(装配方未注入清理回调)\", \"INVALID_STATE\");\n }\n await this.deps.cleanCache();\n return null;\n }\n}\n","/**\n * download_file 动作:下载文件到缓存目录(P2-12)\n *\n * url → fetch 下载 → 存 deps.system.cacheDir(缺省抛错)→ 返回 { file }。\n * 文件名:download-<timestamp>-<basename>(headers 等扩展字段忽略)。\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst downloadFileSchema = z.object({\n url: z.string(),\n thread_count: z.number().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n});\n\ntype DownloadFilePayload = z.infer<typeof downloadFileSchema>;\n\n/** download_file 依赖(cacheDir 由装配方注入,OneBotApi 视图)。 */\nexport type DownloadFileDeps = Pick<OneBotApi, \"cacheDir\">;\n\n/** 下载文件到缓存目录(P2-12)。 */\nexport class DownloadFileAction extends BaseAction<DownloadFilePayload, { file: string }> {\n readonly name = \"download_file\";\n readonly schema = downloadFileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: DownloadFileDeps;\n\n constructor(deps: DownloadFileDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: DownloadFilePayload): Promise<{ file: string }> {\n const { cacheDir } = this.deps;\n if (cacheDir === undefined || cacheDir === \"\") {\n throw kernelError(\"download_file 未配置缓存目录(装配方未注入)\", \"INVALID_STATE\");\n }\n const safeName = basename(new URL(payload.url).pathname) || \"download.bin\";\n const filePath = join(cacheDir, `download-${Date.now()}-${safeName}`);\n mkdirSync(cacheDir, { recursive: true });\n const init: RequestInit = {};\n if (payload.headers !== undefined) {\n init.headers = payload.headers;\n }\n const res = await fetch(payload.url, init);\n if (!res.ok) {\n throw new Error(`下载失败: ${res.status} ${res.statusText}`);\n }\n const buf = new Uint8Array(await res.arrayBuffer());\n writeFileSync(filePath, buf);\n return { file: filePath };\n }\n}\n","/**\n * get_clientkey 动作:获取 clientKey(P2-13 接 kernel TicketApi.getClientKey)\n */\n\nimport type { TicketApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getClientkeySchema = z.object({});\n\ntype GetClientkeyPayload = z.infer<typeof getClientkeySchema>;\n\n/** 获取 clientKey(P2-13 接 kernel TicketApi)。 */\nexport class GetClientkeyAction extends BaseAction<\n GetClientkeyPayload,\n { clientKey: string; keyIndex: string; expireTime: string; url: string }\n> {\n readonly name = \"get_clientkey\";\n readonly schema = getClientkeySchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly ticketApi: TicketApi;\n\n constructor(ticketApi: TicketApi) {\n super();\n this.ticketApi = ticketApi;\n }\n\n protected async _handle(_payload: GetClientkeyPayload): Promise<{\n clientKey: string;\n keyIndex: string;\n expireTime: string;\n url: string;\n }> {\n const raw = await this.ticketApi.getClientKey();\n return {\n clientKey: raw.clientKey,\n keyIndex: raw.keyIndex,\n expireTime: raw.expireTime,\n url: raw.url,\n };\n }\n}\n","/**\n * get_cookies 动作:获取 cookies(P2-13 接 kernel TicketApi.getCookies)\n *\n * domain 缺省 v2.qq.com(NapCat 行为);user_id 缺省用机器人自身 uin。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getCookiesSchema = z.object({\n domain: z.string().optional(),\n user_id: z.number().optional(),\n});\n\ntype GetCookiesPayload = z.infer<typeof getCookiesSchema>;\n\n/** 默认域名。 */\nconst DEFAULT_DOMAIN = \"v2.qq.com\";\n\n/** 获取 cookies(P2-13 接 kernel TicketApi.getCookies)。 */\nexport class GetCookiesAction extends BaseAction<GetCookiesPayload, Record<string, string>> {\n readonly name = \"get_cookies\";\n readonly schema = getCookiesSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">;\n\n constructor(deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">) {\n super();\n this.deps = deps;\n }\n\n protected _handle(payload: GetCookiesPayload): Promise<Record<string, string>> {\n const domain = payload.domain ?? DEFAULT_DOMAIN;\n let uin = this.deps.selfUin;\n if (payload.user_id !== undefined) {\n uin = String(payload.user_id);\n }\n return this.deps.ticketApi.getCookies(domain, uin);\n }\n}\n","/**\n * get_csrf_token / get_credentials 动作(P2-15 接 kernel TicketApi)\n *\n * - get_csrf_token:qun.qq.com cookies 的 skey → bkn(csrf 等价物)\n * - get_credentials:指定域名 cookies + bkn → { cookies, csrf_token }\n */\nimport { TicketApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getCsrfTokenSchema = z.object({});\n\ntype GetCsrfTokenPayload = z.infer<typeof getCsrfTokenSchema>;\n\n/** 默认域名(bkn 计算用)。 */\nconst DEFAULT_DOMAIN = \"qun.qq.com\";\n\n/** 获取 csrf_token(bkn,P2-15)。 */\nexport class GetCsrfTokenAction extends BaseAction<GetCsrfTokenPayload, { token: number }> {\n readonly name = \"get_csrf_token\";\n readonly schema = getCsrfTokenSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">;\n\n constructor(deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(_payload: GetCsrfTokenPayload): Promise<{ token: number }> {\n const cookies = await this.deps.ticketApi.getCookies(DEFAULT_DOMAIN, this.deps.selfUin);\n const skey = cookies[\"skey\"] ?? \"\";\n return { token: Number(TicketApi.getBkn(skey)) };\n }\n}\n\nconst getCredentialsSchema = z.object({\n domain: z.string().optional(),\n});\n\ntype GetCredentialsPayload = z.infer<typeof getCredentialsSchema>;\n\n/** 获取凭据(cookies + csrf_token,P2-15)。 */\nexport class GetCredentialsAction extends BaseAction<\n GetCredentialsPayload,\n { cookies: Record<string, string>; csrf_token: number }\n> {\n readonly name = \"get_credentials\";\n readonly schema = getCredentialsSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">;\n\n constructor(deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetCredentialsPayload): Promise<{\n cookies: Record<string, string>;\n csrf_token: number;\n }> {\n const domain = payload.domain ?? DEFAULT_DOMAIN;\n const cookies = await this.deps.ticketApi.getCookies(domain, this.deps.selfUin);\n return {\n cookies,\n csrf_token: Number(TicketApi.getBkn(cookies[\"skey\"] ?? \"\")),\n };\n }\n}\n","/**\n * get_login_info 动作:获取登录信息(P2-4 注入 self)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { LoginInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getLoginInfoSchema = z.object({});\n\ntype GetLoginInfoPayload = z.infer<typeof getLoginInfoSchema>;\n\n/** 获取登录信息(self 由装配方注入,P2-5 接 kernel selfInfo 维护后取真实昵称)。 */\nexport class GetLoginInfoAction extends BaseAction<GetLoginInfoPayload, LoginInfo> {\n readonly name = \"get_login_info\";\n readonly schema = getLoginInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly self: { uin: string; nickname: string };\n\n constructor(self: { uin: string; nickname: string }) {\n super();\n this.self = self;\n }\n\n protected _handle(_payload: GetLoginInfoPayload): Promise<LoginInfo> {\n return Promise.resolve({\n user_id: Number(this.self.uin),\n nickname: this.self.nickname,\n });\n }\n}\n","/**\n * get_robot_uin_range 动作:获取机器人 QQ 号范围(本地组装,P2-11)\n *\n * NapCat 从配置返回;我们给通用范围(min/max)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getRobotUinRangeSchema = z.object({});\n\ntype GetRobotUinRangePayload = z.infer<typeof getRobotUinRangeSchema>;\n\n/** QQ 号下限。 */\nconst UIN_MIN = 10_001;\n/** QQ 号上限。 */\nconst UIN_MAX = 4_294_967_295;\n\n/** 获取机器人 QQ 号范围(P2-11 本地组装)。 */\nexport class GetRobotUinRangeAction extends BaseAction<\n GetRobotUinRangePayload,\n { min: number; max: number }\n> {\n readonly name = \"get_robot_uin_range\";\n readonly schema = getRobotUinRangeSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n protected _handle(_payload: GetRobotUinRangePayload): Promise<{ min: number; max: number }> {\n return Promise.resolve({ min: UIN_MIN, max: UIN_MAX });\n }\n}\n","/**\n * get_status 动作:获取运行状态(本地组装,P2-11)\n *\n * 返回与心跳 status 同构的 OB11Status(online/good + 扩展字段)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OB11Status } from \"../../event/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getStatusSchema = z.object({});\n\ntype GetStatusPayload = z.infer<typeof getStatusSchema>;\n\n/** 获取运行状态(本地组装,P2-11)。 */\nexport class GetStatusAction extends BaseAction<GetStatusPayload, OB11Status> {\n readonly name = \"get_status\";\n readonly schema = getStatusSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n protected _handle(_payload: GetStatusPayload): Promise<OB11Status> {\n return Promise.resolve({\n online: true,\n good: true,\n });\n }\n}\n","/**\n * get_version_info 动作:获取版本信息(本地组装,P2-11)\n *\n * appVersion 由装配方注入(kernel wrapper 版本或 NAPUTO_QQ_VERSION)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport type { VersionInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getVersionInfoSchema = z.object({});\n\ntype GetVersionInfoPayload = z.infer<typeof getVersionInfoSchema>;\n\n/** get_version_info 依赖(appVersion 由装配方注入,OneBotApi 视图)。 */\nexport type GetVersionInfoDeps = Pick<OneBotApi, \"appVersion\">;\n\n/** 获取版本信息(本地组装,P2-11)。 */\nexport class GetVersionInfoAction extends BaseAction<GetVersionInfoPayload, VersionInfo> {\n readonly name = \"get_version_info\";\n readonly schema = getVersionInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: GetVersionInfoDeps;\n\n constructor(deps: GetVersionInfoDeps) {\n super();\n this.deps = deps;\n }\n\n protected _handle(_payload: GetVersionInfoPayload): Promise<VersionInfo> {\n return Promise.resolve({\n app_name: \"napuketto-qq\",\n app_version: this.deps.appVersion,\n protocol_version: \"v11\",\n });\n }\n}\n","/**\n * bot_exit / set_restart 动作:退出 / 重启(P2-12)\n *\n * exit/restart 回调由装配方注入(boot.cjs 接进程控制)。未配置时明确报错。\n */\n\nimport { kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst botExitSchema = z.object({});\n\ntype BotExitPayload = z.infer<typeof botExitSchema>;\n\n/** 退出/重启依赖(回调由装配方注入,OneBotApi 视图)。 */\nexport type ProcessControlDeps = Pick<OneBotApi, \"exit\" | \"restart\">;\n\n/** 退出机器人进程(P2-12)。 */\nexport class BotExitAction extends BaseAction<BotExitPayload, null> {\n readonly name = \"bot_exit\";\n readonly schema = botExitSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: ProcessControlDeps;\n\n constructor(deps: ProcessControlDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(_payload: BotExitPayload): Promise<null> {\n if (this.deps.exit === undefined) {\n throw kernelError(\"bot_exit 未配置(装配方未注入退出回调)\", \"INVALID_STATE\");\n }\n await this.deps.exit();\n return null;\n }\n}\n\n/** 重启机器人(P2-12;重启交给装配方,缺省退化为退出)。 */\nexport class SetRestartAction extends BaseAction<BotExitPayload, null> {\n readonly name = \"set_restart\";\n readonly schema = botExitSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: ProcessControlDeps;\n\n constructor(deps: ProcessControlDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(_payload: BotExitPayload): Promise<null> {\n const restart = this.deps.restart ?? this.deps.exit;\n if (restart === undefined) {\n throw kernelError(\"set_restart 未配置(装配方未注入重启回调)\", \"INVALID_STATE\");\n }\n await restart();\n return null;\n }\n}\n","/** 资料类动作(P2-14):set_self_longnick / set_qq_profile / set_qq_avatar\n */\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { kernelError, type ProfileApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\n/** URL 前缀(头像在线文件识别)。 */\nconst URL_PREFIX = /^https?:\\/\\//;\n\nconst setSelfLongnickSchema = z.object({\n longNick: z.string(),\n});\n\ntype SetSelfLongnickPayload = z.infer<typeof setSelfLongnickSchema>;\n\n/** 设置个性签名(P2-14 接 kernel ProfileApi.setLongNick)。 */\nexport class SetSelfLongnickAction extends BaseAction<SetSelfLongnickPayload, null> {\n readonly name = \"set_self_longnick\";\n readonly schema = setSelfLongnickSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly profileApi: ProfileApi;\n\n constructor(profileApi: ProfileApi) {\n super();\n this.profileApi = profileApi;\n }\n\n protected async _handle(payload: SetSelfLongnickPayload): Promise<null> {\n await this.profileApi.setLongNick(payload.longNick);\n return null;\n }\n}\n\nconst setQQProfileSchema = z.object({\n nickname: z.string(),\n personal_note: z.string().optional(),\n sex: z.union([z.number(), z.string()]).optional(),\n});\n\ntype SetQQProfilePayload = z.infer<typeof setQQProfileSchema>;\n\n/** 设置 QQ 资料(P2-14;nickname → setNickName,personal_note → setLongNick,sex 忽略)。 */\nexport class SetQQProfileAction extends BaseAction<SetQQProfilePayload, null> {\n readonly name = \"set_qq_profile\";\n readonly schema = setQQProfileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly profileApi: ProfileApi;\n\n constructor(profileApi: ProfileApi) {\n super();\n this.profileApi = profileApi;\n }\n\n protected async _handle(payload: SetQQProfilePayload): Promise<null> {\n await this.profileApi.setNickName(payload.nickname);\n if (payload.personal_note !== undefined) {\n await this.profileApi.setLongNick(payload.personal_note);\n }\n return null;\n }\n}\n\nconst setQQAvatarSchema = z.object({\n /** 本地路径(URL 需先下载,由装配方 cacheDir 支持)。 */\n file: z.string(),\n});\n\ntype SetQQAvatarPayload = z.infer<typeof setQQAvatarSchema>;\n\n/** 设置头像依赖(cacheDir 供 URL 下载,OneBotApi 视图)。 */\nexport type SetQQAvatarDeps = Pick<OneBotApi, \"profileApi\" | \"cacheDir\">;\n\n/** 设置 QQ 头像(P2-14 接 kernel ProfileApi.setHeader)。 */\nexport class SetQQAvatarAction extends BaseAction<SetQQAvatarPayload, null> {\n readonly name = \"set_qq_avatar\";\n readonly schema = setQQAvatarSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SetQQAvatarDeps;\n\n constructor(deps: SetQQAvatarDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SetQQAvatarPayload): Promise<null> {\n let filePath = payload.file;\n if (URL_PREFIX.test(filePath)) {\n filePath = await this.downloadToCache(filePath);\n }\n if (!existsSync(filePath)) {\n throw kernelError(`头像文件不存在: ${filePath}`, \"NOT_FOUND\");\n }\n await this.deps.profileApi.setHeader(filePath);\n return null;\n }\n\n /** URL 下载到缓存目录(cacheDir 缺省抛错)。 */\n private async downloadToCache(url: string): Promise<string> {\n const { cacheDir } = this.deps;\n if (cacheDir === undefined || cacheDir === \"\") {\n throw kernelError(\n \"set_qq_avatar 处理 URL 需要缓存目录(装配方未注入)\",\n \"INVALID_STATE\",\n );\n }\n const safeName = basename(new URL(url).pathname) || \"avatar.bin\";\n const filePath = join(cacheDir, `avatar-${Date.now()}-${safeName}`);\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`头像下载失败: ${res.status} ${res.statusText}`);\n }\n const buf = new Uint8Array(await res.arrayBuffer());\n writeFileSync(filePath, buf);\n return filePath;\n }\n}\n","/**\n * set_diy_online_status 动作:设置自定义在线状态(P2-12 接 kernel setOnlineStatus)\n *\n * customStatus(faceId/wording/faceType)随 setStatus 一并提交;\n * status 缺省 10(在线)。\n */\n\nimport type { MsgApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setDiyOnlineStatusSchema = z.object({\n status: z.number().optional(),\n /** 自定义状态文案。 */\n wording: z.string(),\n /** 表情 ID。 */\n face_id: z.string().optional(),\n /** 表情类型。 */\n face_type: z.string().optional(),\n});\n\ntype SetDiyOnlineStatusPayload = z.infer<typeof setDiyOnlineStatusSchema>;\n\n/** 默认在线状态值。 */\nconst STATUS_ONLINE = 10;\n\n/** 设置自定义在线状态(P2-12 接 kernel setOnlineStatus customStatus)。 */\nexport class SetDiyOnlineStatusAction extends BaseAction<SetDiyOnlineStatusPayload, null> {\n readonly name = \"set_diy_online_status\";\n readonly schema = setDiyOnlineStatusSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly msgApi: MsgApi;\n\n constructor(msgApi: MsgApi) {\n super();\n this.msgApi = msgApi;\n }\n\n protected async _handle(payload: SetDiyOnlineStatusPayload): Promise<null> {\n const customStatus = {\n faceId: payload.face_id ?? \"\",\n wording: payload.wording,\n faceType: payload.face_type ?? \"1\",\n };\n await this.msgApi.setOnlineStatus({\n status: payload.status ?? STATUS_ONLINE,\n extStatus: 0,\n batteryStatus: 0,\n customStatus,\n });\n return null;\n }\n}\n","/**\n * set_online_status 动作:设置在线状态(P2-12 接 kernel MsgApi.setOnlineStatus)\n *\n * status/ext_status/battery_status 见 NapCat 状态表(在线 10 / 离开 30 / 隐身 40\n * / 忙碌 50 / Q我吧 60 / 请勿打扰 70 等)。\n */\n\nimport type { MsgApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setOnlineStatusSchema = z.object({\n status: z.number().optional(),\n ext_status: z.number().optional(),\n battery_status: z.number().optional(),\n});\n\ntype SetOnlineStatusPayload = z.infer<typeof setOnlineStatusSchema>;\n\n/** 默认在线状态值。 */\nconst STATUS_ONLINE = 10;\n\n/** 设置在线状态(P2-12 接 kernel setOnlineStatus)。 */\nexport class SetOnlineStatusAction extends BaseAction<SetOnlineStatusPayload, null> {\n readonly name = \"set_online_status\";\n readonly schema = setOnlineStatusSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly msgApi: MsgApi;\n\n constructor(msgApi: MsgApi) {\n super();\n this.msgApi = msgApi;\n }\n\n protected async _handle(payload: SetOnlineStatusPayload): Promise<null> {\n await this.msgApi.setOnlineStatus({\n status: payload.status ?? STATUS_ONLINE,\n extStatus: payload.ext_status ?? 0,\n batteryStatus: payload.battery_status ?? 0,\n });\n return null;\n }\n}\n","/**\n * translate_en2zh 动作:英文单词翻译(P2-14 接 kernel RichMediaApi.translateWords)\n */\nimport type { RichMediaApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst translateEn2ZhSchema = z.object({\n words: z.array(z.string()),\n});\n\ntype TranslateEn2ZhPayload = z.infer<typeof translateEn2ZhSchema>;\n\n/** 英文单词翻译(P2-14)。 */\nexport class TranslateEn2ZhAction extends BaseAction<TranslateEn2ZhPayload, { words: string[] }> {\n readonly name = \"translate_en2zh\";\n readonly schema = translateEn2ZhSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: TranslateEn2ZhPayload): Promise<{ words: string[] }> {\n const words = await this.richMediaApi.translateWords(payload.words);\n return { words };\n }\n}\n","/**\n * OneBot 11 动作注册表(ADR-013 延伸)\n * 各协议维护自己的 ActionRegistry,由协议 adapter 挂到请求分发。\n * P2-16:deps 收敛为 { api: OneBotApi } 单聚合对象(基础设施第一项)。\n *\n * 同时是 action 域 barrel:re-export 全部动作类 + error-map + resolve-uid,\n * 协议外部只从本入口消费动作面。\n */\nimport { ActionRegistry } from \"../../core/index.js\";\nimport type { OneBotApi } from \"../api/index.js\";\n\nexport { ob11ErrorCodeMap } from \"./error-map.js\";\nexport type { AtAllRemainInfo } from \"./group/get-group-at-all-remain.js\";\nexport { resolveUid } from \"./resolve-uid.js\";\n\nimport { DeleteFriendAction } from \"./friend/delete-friend.js\";\nimport { GetDoubtFriendsAddRequestAction } from \"./friend/get-doubt-friends-add-request.js\";\nimport { GetFriendListAction } from \"./friend/get-friend-list.js\";\nimport { GetFriendsWithCategoryAction } from \"./friend/get-friends-with-category.js\";\nimport { GetStrangerInfoAction } from \"./friend/get-stranger-info.js\";\nimport { SendLikeAction } from \"./friend/send-like.js\";\nimport { SetDoubtFriendsAddRequestAction } from \"./friend/set-doubt-friends-add-request.js\";\nimport { SetFriendAddRequestAction } from \"./friend/set-friend-add-request.js\";\nimport { SetFriendRemarkAction } from \"./friend/set-friend-remark.js\";\nimport { DeleteEssenceMsgAction } from \"./group/delete-essence-msg.js\";\nimport { GetEssenceMsgListAction } from \"./group/get-essence-msg-list.js\";\nimport {\n GetGroupAddRequestAction,\n GetGroupIgnoredNotifiesAction,\n} from \"./group/get-group-add-request.js\";\nimport { GetGroupAtAllRemainAction } from \"./group/get-group-at-all-remain.js\";\nimport { GetGroupHonorInfoAction } from \"./group/get-group-honor-info.js\";\nimport { GetGroupInfoAction } from \"./group/get-group-info.js\";\nimport { GetGroupListAction } from \"./group/get-group-list.js\";\nimport { GetGroupMemberInfoAction } from \"./group/get-group-member-info.js\";\nimport { GetGroupMemberListAction } from \"./group/get-group-member-list.js\";\nimport { GetGroupShutListAction } from \"./group/get-group-shut-list.js\";\nimport { GetGroupSystemMsgAction } from \"./group/get-group-system-msg.js\";\nimport {\n CreateGroupFileFolderAction,\n DeleteGroupFileAction,\n DeleteGroupFolderAction,\n MoveGroupFileAction,\n RenameGroupFileAction,\n TransGroupFileAction,\n} from \"./group/group-files-op.js\";\nimport {\n GetGroupFileSystemInfoAction,\n GetGroupFilesByFolderAction,\n GetGroupRootFilesAction,\n} from \"./group/group-files-query.js\";\nimport { SetEssenceMsgAction } from \"./group/set-essence-msg.js\";\nimport { SetGroupAddRequestAction } from \"./group/set-group-add-request.js\";\nimport { SetGroupAdminAction } from \"./group/set-group-admin.js\";\nimport { SetGroupBanAction } from \"./group/set-group-ban.js\";\nimport { SetGroupCardAction } from \"./group/set-group-card.js\";\nimport { SetGroupKickAction } from \"./group/set-group-kick.js\";\nimport { SetGroupLeaveAction } from \"./group/set-group-leave.js\";\nimport { SetGroupNameAction } from \"./group/set-group-name.js\";\nimport { SetGroupWholeBanAction } from \"./group/set-group-whole-ban.js\";\nimport { DeleteMsgAction } from \"./message/delete-msg.js\";\nimport { FetchPttTextAction } from \"./message/fetch-ptt-text.js\";\nimport {\n ForwardFriendSingleMsgAction,\n ForwardGroupSingleMsgAction,\n} from \"./message/forward-single-msg.js\";\nimport { GetForwardMsgAction } from \"./message/get-forward-msg.js\";\nimport { GetFriendMsgHistoryAction } from \"./message/get-friend-msg-history.js\";\nimport { GetGroupMsgHistoryAction } from \"./message/get-group-msg-history.js\";\nimport { GetImageAction, GetRecordAction } from \"./message/get-media.js\";\nimport { GetMsgAction } from \"./message/get-msg.js\";\nimport { MarkMsgAsReadAction } from \"./message/mark-msg-as-read.js\";\nimport {\n MarkGroupMsgAsReadAction,\n MarkPrivateMsgAsReadAction,\n} from \"./message/mark-msg-as-read-aliases.js\";\nimport {\n SendGroupForwardMsgAction,\n SendPrivateForwardMsgAction,\n} from \"./message/send-forward-msg.js\";\nimport { SendGroupMsgAction } from \"./message/send-group-msg.js\";\nimport { SendMsgAction } from \"./message/send-msg.js\";\nimport { SendPrivateMsgAction } from \"./message/send-private-msg.js\";\nimport { SetInputStatusAction } from \"./message/set-input-status.js\";\nimport { SetMsgEmojiLikeAction } from \"./message/set-msg-emoji-like.js\";\nimport { CanSendImageAction } from \"./system/can-send-image.js\";\nimport { CanSendRecordAction } from \"./system/can-send-record.js\";\nimport { CleanCacheAction } from \"./system/clean-cache.js\";\nimport { DownloadFileAction } from \"./system/download-file.js\";\nimport { GetClientkeyAction } from \"./system/get-clientkey.js\";\nimport { GetCookiesAction } from \"./system/get-cookies.js\";\nimport { GetCredentialsAction, GetCsrfTokenAction } from \"./system/get-credentials.js\";\nimport { GetLoginInfoAction } from \"./system/get-login-info.js\";\nimport { GetRobotUinRangeAction } from \"./system/get-robot-uin-range.js\";\nimport { GetStatusAction } from \"./system/get-status.js\";\nimport { GetVersionInfoAction } from \"./system/get-version-info.js\";\nimport { BotExitAction, SetRestartAction } from \"./system/process-control.js\";\nimport {\n SetQQAvatarAction,\n SetQQProfileAction,\n SetSelfLongnickAction,\n} from \"./system/profile-actions.js\";\nimport { SetDiyOnlineStatusAction } from \"./system/set-diy-online-status.js\";\nimport { SetOnlineStatusAction } from \"./system/set-online-status.js\";\nimport { TranslateEn2ZhAction } from \"./system/translate-en2zh.js\";\n\n/** 动作注册表依赖(P2-16:动作只依赖一个聚合对象)。 */\nexport interface Ob11ActionDeps {\n /** OneBotApi 聚合(9 个 kernel apis + messageUnique + self/system)。 */\n api: OneBotApi;\n}\n\n/** 构建 OB11 动作注册表(所有 OB11 动作在此注册,按组拆分控制行数)。 */\nexport function createOb11ActionRegistry(deps: Ob11ActionDeps): ActionRegistry {\n const registry = new ActionRegistry();\n registerMsgActions(registry, deps);\n registerForwardActions(registry, deps);\n registerQueryActions(registry, deps);\n registerGroupActions(registry, deps);\n registerFriendActions(registry, deps);\n registerSystemActions(registry, deps);\n registerGroupNotifyActions(registry, deps);\n registerTicketActions(registry, deps);\n registerProfileActions(registry, deps);\n registerGroupFileActions(registry, deps);\n registerWebActions(registry, deps);\n return registry;\n}\n\n/** 群空间 web / csrf / 陌生人 / 群请求动作(P2-15)。 */\nfunction registerWebActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new GetStrangerInfoAction(deps.api.profileApi));\n registry.register(new GetCsrfTokenAction(deps.api));\n registry.register(new GetCredentialsAction(deps.api));\n registry.register(new GetGroupAddRequestAction(deps.api.groupNotifyApi));\n registry.register(new GetGroupIgnoredNotifiesAction(deps.api.groupNotifyApi));\n registry.register(new GetEssenceMsgListAction(deps.api.webApi));\n registry.register(new GetGroupHonorInfoAction(deps.api.webApi));\n}\n\n/** 资料/点赞/翻译动作(P2-14)。 */\nfunction registerProfileActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SetSelfLongnickAction(deps.api.profileApi));\n registry.register(new SetQQProfileAction(deps.api.profileApi));\n registry.register(new SetQQAvatarAction(deps.api));\n registry.register(new TranslateEn2ZhAction(deps.api.richMediaApi));\n registry.register(new SendLikeAction(deps.api));\n}\n\n/** 群文件动作(P2-14)。 */\nfunction registerGroupFileActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new GetGroupRootFilesAction(deps.api.richMediaApi));\n registry.register(new GetGroupFilesByFolderAction(deps.api.richMediaApi));\n registry.register(new GetGroupFileSystemInfoAction(deps.api.richMediaApi));\n registry.register(new CreateGroupFileFolderAction(deps.api.richMediaApi));\n registry.register(new DeleteGroupFileAction(deps.api.richMediaApi));\n registry.register(new DeleteGroupFolderAction(deps.api.richMediaApi));\n registry.register(new RenameGroupFileAction(deps.api.richMediaApi));\n registry.register(new MoveGroupFileAction(deps.api.richMediaApi));\n registry.register(new TransGroupFileAction(deps.api.richMediaApi));\n}\n\n/** 群通知/禁言列表动作(P2-13)。 */\nfunction registerGroupNotifyActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SetGroupAddRequestAction(deps.api.groupNotifyApi));\n registry.register(new GetGroupSystemMsgAction(deps.api));\n registry.register(new GetGroupShutListAction(deps.api));\n}\n\n/** 票据动作(P2-13)。 */\nfunction registerTicketActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new GetClientkeyAction(deps.api.ticketApi));\n registry.register(new GetCookiesAction(deps.api));\n}\n\n/** 合并转发 / 单条转发 / 在线状态(P2-12)。 */\nfunction registerForwardActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SendGroupForwardMsgAction(deps.api));\n registry.register(new SendPrivateForwardMsgAction(deps.api));\n registry.register(new GetForwardMsgAction(deps.api));\n registry.register(new ForwardGroupSingleMsgAction(deps.api));\n registry.register(new ForwardFriendSingleMsgAction(deps.api));\n registry.register(new SetOnlineStatusAction(deps.api.msgApi));\n registry.register(new SetDiyOnlineStatusAction(deps.api.msgApi));\n}\n\n/** 消息类动作(P2-3 / P2-10 / P2-11)。 */\nfunction registerMsgActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SendMsgAction(deps.api));\n registry.register(new SendPrivateMsgAction(deps.api));\n registry.register(new SendGroupMsgAction(deps.api));\n registry.register(new DeleteMsgAction(deps.api));\n registry.register(new GetMsgAction(deps.api));\n registry.register(new GetGroupMsgHistoryAction(deps.api));\n registry.register(new GetFriendMsgHistoryAction(deps.api));\n registry.register(new MarkMsgAsReadAction(deps.api));\n registry.register(new MarkPrivateMsgAsReadAction(deps.api));\n registry.register(new MarkGroupMsgAsReadAction(deps.api));\n registry.register(new SetMsgEmojiLikeAction(deps.api));\n registry.register(new FetchPttTextAction(deps.api));\n registry.register(new SetInputStatusAction(deps.api));\n registry.register(new GetImageAction(deps.api));\n registry.register(new GetRecordAction(deps.api));\n}\n\n/** 查询类动作(P2-4;P2-17 群信息/成员动作读 GroupCache)。 */\nfunction registerQueryActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new GetLoginInfoAction(deps.api.self));\n registry.register(new GetGroupInfoAction(deps.api));\n registry.register(new GetGroupListAction(deps.api));\n registry.register(new GetGroupMemberInfoAction(deps.api));\n registry.register(new GetGroupMemberListAction(deps.api));\n registry.register(new GetFriendListAction(deps.api.friendApi));\n}\n\n/** 群管类动作(P2-10)。 */\nfunction registerGroupActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SetGroupKickAction(deps.api.groupApi));\n registry.register(new SetGroupBanAction(deps.api.groupApi));\n registry.register(new SetGroupWholeBanAction(deps.api.groupApi));\n registry.register(new SetGroupAdminAction(deps.api.groupApi));\n registry.register(new SetGroupCardAction(deps.api.groupApi));\n registry.register(new SetGroupNameAction(deps.api.groupApi));\n registry.register(new SetGroupLeaveAction(deps.api.groupApi));\n registry.register(new SetEssenceMsgAction(deps.api));\n registry.register(new DeleteEssenceMsgAction(deps.api));\n registry.register(new GetGroupAtAllRemainAction(deps.api.groupApi));\n}\n\n/** 好友类动作(P2-11)。 */\nfunction registerFriendActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SetFriendAddRequestAction(deps.api.friendApi));\n registry.register(new SetFriendRemarkAction(deps.api));\n registry.register(new DeleteFriendAction(deps.api));\n registry.register(new GetFriendsWithCategoryAction(deps.api.friendApi));\n registry.register(new GetDoubtFriendsAddRequestAction(deps.api.friendApi));\n registry.register(new SetDoubtFriendsAddRequestAction(deps.api.friendApi));\n}\n\n/** 系统类动作(P2-11 / P2-12)。 */\nfunction registerSystemActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new GetStatusAction());\n registry.register(new GetVersionInfoAction(deps.api));\n registry.register(new CleanCacheAction(deps.api));\n registry.register(new CanSendImageAction());\n registry.register(new CanSendRecordAction());\n registry.register(new GetRobotUinRangeAction());\n registry.register(new DownloadFileAction(deps.api));\n registry.register(new BotExitAction(deps.api));\n registry.register(new SetRestartAction(deps.api));\n}\n\n/** action 域公共面(barrel re-export,协议外部从本入口消费动作类)。 */\nexport {\n BotExitAction,\n CanSendImageAction,\n CanSendRecordAction,\n CleanCacheAction,\n CreateGroupFileFolderAction,\n DeleteEssenceMsgAction,\n DeleteFriendAction,\n DeleteGroupFileAction,\n DeleteGroupFolderAction,\n DeleteMsgAction,\n DownloadFileAction,\n FetchPttTextAction,\n ForwardFriendSingleMsgAction,\n ForwardGroupSingleMsgAction,\n GetClientkeyAction,\n GetCookiesAction,\n GetCredentialsAction,\n GetCsrfTokenAction,\n GetDoubtFriendsAddRequestAction,\n GetEssenceMsgListAction,\n GetForwardMsgAction,\n GetFriendListAction,\n GetFriendMsgHistoryAction,\n GetFriendsWithCategoryAction,\n GetGroupAddRequestAction,\n GetGroupAtAllRemainAction,\n GetGroupFileSystemInfoAction,\n GetGroupFilesByFolderAction,\n GetGroupHonorInfoAction,\n GetGroupIgnoredNotifiesAction,\n GetGroupInfoAction,\n GetGroupListAction,\n GetGroupMemberInfoAction,\n GetGroupMemberListAction,\n GetGroupMsgHistoryAction,\n GetGroupRootFilesAction,\n GetGroupShutListAction,\n GetGroupSystemMsgAction,\n GetImageAction,\n GetLoginInfoAction,\n GetRecordAction,\n GetRobotUinRangeAction,\n GetStatusAction,\n GetStrangerInfoAction,\n GetVersionInfoAction,\n MarkGroupMsgAsReadAction,\n MarkMsgAsReadAction,\n MarkPrivateMsgAsReadAction,\n MoveGroupFileAction,\n RenameGroupFileAction,\n SendGroupForwardMsgAction,\n SendGroupMsgAction,\n SendLikeAction,\n SendMsgAction,\n SendPrivateForwardMsgAction,\n SendPrivateMsgAction,\n SetDiyOnlineStatusAction,\n SetDoubtFriendsAddRequestAction,\n SetEssenceMsgAction,\n SetFriendAddRequestAction,\n SetFriendRemarkAction,\n SetGroupAddRequestAction,\n SetGroupAdminAction,\n SetGroupBanAction,\n SetGroupCardAction,\n SetGroupKickAction,\n SetGroupLeaveAction,\n SetGroupNameAction,\n SetGroupWholeBanAction,\n SetInputStatusAction,\n SetMsgEmojiLikeAction,\n SetOnlineStatusAction,\n SetQQAvatarAction,\n SetQQProfileAction,\n SetRestartAction,\n SetSelfLongnickAction,\n TransGroupFileAction,\n TranslateEn2ZhAction,\n};\n","/**\n * OneBotApi:OneBot 11 动作的统一依赖聚合(P2-16,基础设施第一项)\n *\n * 单类持有 9 个 kernel apis + 协议层共享状态(messageUnique / self / system 回调),\n * 动作只依赖一个聚合对象(或 Pick 视图),boot.cjs 装配面只出现一个聚合对象。\n *\n * - 便捷方法 uinToUid / uidToUin 委托 groupApi(动作无需再注入转换函数)。\n * - 系统回调拍平为顶层字段(exactOptionalPropertyTypes:显式 `| undefined` 联合)。\n */\n\nimport type {\n FriendApi,\n GroupCache,\n GroupNotifyApi,\n MsgApi,\n ProfileApi,\n ProfileLikeApi,\n RichMediaApi,\n TicketApi,\n WebApi,\n} from \"@napuketto/kernel\";\nimport { GroupApi } from \"@napuketto/kernel\";\nimport type { GroupSenderRole } from \"../helper/data.js\";\nimport { MessageUnique } from \"../helper/message-unique.js\";\n\n/** 系统类本地回调(get_version_info / clean_cache / download_file / 进程控制用)。 */\nexport interface OneBotSystemOptions {\n /** 运行版本(get_version_info 用,缺省 unknown)。 */\n appVersion: string;\n /** 缓存清理回调(clean_cache 用,未配置抛错)。 */\n cleanCache?: () => Promise<void>;\n /** 缓存目录(download_file 保存路径 / get_image 主动下载落盘)。 */\n cacheDir?: string;\n /** QQ NT global 目录(get_image/get_record 解析 NT 相对路径用,2026-09-08 T5)。 */\n mediaBaseDir?: string;\n /** 进程退出回调(bot_exit 用)。 */\n exit?: () => Promise<void>;\n /** 进程重启回调(set_restart 用,缺省退化为退出)。 */\n restart?: () => Promise<void>;\n}\n\n/** OneBotApi 构造参数。 */\nexport interface OneBotApiOptions {\n msgApi: MsgApi;\n groupApi: GroupApi;\n groupNotifyApi: GroupNotifyApi;\n friendApi: FriendApi;\n ticketApi: TicketApi;\n richMediaApi: RichMediaApi;\n profileApi: ProfileApi;\n profileLikeApi: ProfileLikeApi;\n webApi: WebApi;\n /** 登录身份(get_login_info 用)。 */\n self: { uin: string; nickname: string };\n /** 系统类本地信息。 */\n system: OneBotSystemOptions;\n /** 群/成员缓存(ADR-008,读缓存动作用;未装配时动作直查 api)。 */\n groupCache?: GroupCache;\n}\n\n/**\n * OneBot 11 动作统一依赖聚合(P2-16)。\n * 各动作经 `Pick<OneBotApi, ...>` 取所需成员;注册处只构造一次本对象。\n */\nexport class OneBotApi {\n /** kernel 消息 API(send_msg 等消息类动作用)。 */\n readonly msgApi: MsgApi;\n /** kernel 群 API。 */\n readonly groupApi: GroupApi;\n /** kernel 群通知 API(群请求/禁言列表用)。 */\n readonly groupNotifyApi: GroupNotifyApi;\n /** kernel 好友 API。 */\n readonly friendApi: FriendApi;\n /** kernel 票据 API(get_clientkey/get_cookies 用)。 */\n readonly ticketApi: TicketApi;\n /** kernel 富媒体 API(群文件/翻译用)。 */\n readonly richMediaApi: RichMediaApi;\n /** kernel 资料 API(签名/昵称/头像用)。 */\n readonly profileApi: ProfileApi;\n /** kernel 点赞 API(send_like 用)。 */\n readonly profileLikeApi: ProfileLikeApi;\n /** kernel 群空间 web API(精华/荣誉用)。 */\n readonly webApi: WebApi;\n /** 群/成员缓存(ADR-008;翻译层只读消费,缺失惰性回填)。 */\n readonly groupCache: GroupCache | undefined;\n /** OB11 message_id ↔ NT msgId 双向映射(收链路与动作共用同一映射空间)。 */\n readonly messageUnique: MessageUnique;\n /** 登录身份(get_login_info 用)。 */\n readonly self: { uin: string; nickname: string };\n /** 机器人自身 uin(get_cookies / csrf 用)。 */\n readonly selfUin: string;\n /** 运行版本(get_version_info 用)。 */\n readonly appVersion: string;\n /** 缓存清理回调(clean_cache 用)。 */\n readonly cleanCache: (() => Promise<void>) | undefined;\n /** 缓存目录(download_file 用)。 */\n readonly cacheDir: string | undefined;\n /** QQ NT global 目录(媒体 NT 相对路径解析用)。 */\n readonly mediaBaseDir: string | undefined;\n /** 进程退出回调(bot_exit 用)。 */\n readonly exit: (() => Promise<void>) | undefined;\n /** 进程重启回调(set_restart 用)。 */\n readonly restart: (() => Promise<void>) | undefined;\n\n constructor(opts: OneBotApiOptions) {\n this.msgApi = opts.msgApi;\n this.groupApi = opts.groupApi;\n this.groupNotifyApi = opts.groupNotifyApi;\n this.friendApi = opts.friendApi;\n this.ticketApi = opts.ticketApi;\n this.richMediaApi = opts.richMediaApi;\n this.profileApi = opts.profileApi;\n this.profileLikeApi = opts.profileLikeApi;\n this.webApi = opts.webApi;\n this.groupCache = opts.groupCache;\n this.messageUnique = new MessageUnique();\n this.self = opts.self;\n this.selfUin = opts.self.uin;\n this.appVersion = opts.system.appVersion;\n this.cleanCache = opts.system.cleanCache;\n this.cacheDir = opts.system.cacheDir;\n this.mediaBaseDir = opts.system.mediaBaseDir;\n this.exit = opts.system.exit;\n this.restart = opts.system.restart;\n }\n\n /** uin→uid 转换(委托 groupApi;私聊目标/成员 user_id 用)。 */\n uinToUid(uins: string[]): Promise<Map<string, string>> {\n return this.groupApi.uinToUid(uins);\n }\n\n /** uid→uin 转换(委托 groupApi;notice/grayTip 用)。 */\n uidToUin(uids: string[]): Promise<Map<string, string>> {\n return this.groupApi.uidToUin(uids);\n }\n\n /**\n * 群成员角色(GroupCache 缓存优先,缺失惰性回填;sender.role 判定用)。\n * 未装配缓存 / 成员不在群 / 查询失败 → undefined(调用方回退缺省 \"member\",\n * 不阻塞消息上报)。\n */\n async groupMemberRole(groupCode: string, uid: string): Promise<GroupSenderRole | undefined> {\n if (this.groupCache === undefined) {\n return undefined;\n }\n try {\n const member = await this.groupCache.getMember(groupCode, uid);\n return member === undefined ? undefined : GroupApi.roleToString(member.role);\n } catch {\n return undefined;\n }\n }\n\n /**\n * 群成员角色表(历史消息批量用:一次整表读取,uid → role)。\n * 失败语义同 groupMemberRole。\n */\n async groupMemberRoles(groupCode: string): Promise<Map<string, GroupSenderRole> | undefined> {\n if (this.groupCache === undefined) {\n return undefined;\n }\n try {\n const out = new Map<string, GroupSenderRole>();\n for (const member of await this.groupCache.getMembers(groupCode)) {\n out.set(member.uid, GroupApi.roleToString(member.role));\n }\n return out;\n } catch {\n return undefined;\n }\n }\n}\n","/**\n * OB11 消息事件翻译(RawMessage → OB11 消息事件,纯函数,ADR-008)\n *\n * 与 message-info.ts 的 toOb11MessageInfo(get_msg/历史消息返回结构)是两套格式:\n * 事件带 self_id/post_type/message_id;信息结构用于动作返回。\n */\nimport type { RawMessage } from \"@napuketto/kernel\";\nimport { ChatType, toCanonicalElements } from \"@napuketto/kernel\";\nimport type {\n OB11GroupMessageEvent,\n OB11MessageEvent,\n OB11PrivateMessageEvent,\n} from \"../event/index.js\";\nimport type { GroupSender } from \"../event/message.js\";\nimport type { Sender } from \"../types/index.js\";\nimport {\n applyReceiveContext,\n canonicalToCqMessage,\n canonicalToSegments,\n type ReceiveTranslateContext,\n} from \"./data.js\";\nimport type { MessageUnique } from \"./message-unique.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/** RawMessage → OB11 消息事件(message_id 经 MessageUnique 映射并记录 peer)。\n * messageFormat 决定 message 字段格式:array = 消息段数组(标准),string = CQ 码字符串。\n * ctx(可选):接收方向 ID 转换上下文(at uid→uin、reply NT msgId→OB11 id,P2-19)。 */\nexport function toOb11MessageEvent(\n msg: RawMessage,\n selfUin: string,\n unique: MessageUnique,\n messageFormat: \"array\" | \"string\" = \"array\",\n ctx: ReceiveTranslateContext = {},\n): OB11MessageEvent {\n const elements = applyReceiveContext(toCanonicalElements(msg), ctx);\n const segments = canonicalToSegments(elements);\n const time = Math.floor(Number(msg.msgTime) / MS_TO_SEC);\n const selfId = Number(selfUin);\n const userId = Number(msg.senderUin);\n // 记录 peer:delete_msg / get_msg 等只有 message_id 的动作可反查\n const messageId = unique.alloc(msg.msgId, {\n chatType: msg.chatType,\n peerUid: msg.peerUid,\n });\n const base = {\n time,\n self_id: selfId,\n post_type: \"message\" as const,\n message_id: messageId,\n message: messageFormat === \"string\" ? canonicalToCqMessage(elements) : segments,\n raw_message: canonicalToCqMessage(elements),\n font: 0,\n };\n\n if (msg.chatType === ChatType.GROUP) {\n const sender: GroupSender = {\n user_id: userId,\n nickname: msg.sendNickName,\n // 发送者角色由调用方经 ctx 注入(GroupCache 查询在协议边界,翻译纯函数)\n role: ctx.senderRole ?? \"member\",\n };\n if (msg.sendMemberName !== undefined) {\n sender.card = msg.sendMemberName;\n }\n const event: OB11GroupMessageEvent = {\n ...base,\n message_type: \"group\",\n sub_type: \"normal\",\n group_id: Number(msg.peerUid),\n user_id: userId,\n sender,\n };\n return event;\n }\n\n // 私聊:C2C=好友,临时会话(群内私聊)sub_type=group\n let subType: \"friend\" | \"group\" = \"friend\";\n if (msg.chatType === ChatType.C2C_TEMP) {\n subType = \"group\";\n }\n const sender: Sender = {\n user_id: userId,\n nickname: msg.sendNickName,\n };\n const event: OB11PrivateMessageEvent = {\n ...base,\n message_type: \"private\",\n sub_type: subType,\n user_id: userId,\n sender,\n };\n return event;\n}\n","/**\n * OB11 notice 事件翻译·扩展源(c3,2026-09-10)\n *\n * 数据源 = kernel 桥 2026-09-10 新接线回调(notice.ts 的 grayTip 路径之外):\n * - Msg/onRecvOfflineFileMsg → OB11 offline_file notice(翻译)\n * - Msg/onRecvSysMsg / Msg/onRecvOnlineFileMsg / Group/onGroupEssenceListChange\n * → 暂不翻译(adapter 侧 raw 校准日志;sys msg 为群名片/头衔/精华等系统\n * 事件的总载体,真实 payload 到达后回填翻译)\n *\n * ⚠️ payload 形状未经真实事件校准(方法名证据 = wrapper.node 字符串,见 kernel\n * listeners 注释)——防御性收窄:未知形状返回 null,调用方打 raw 日志积累校准\n * 数据(与 narrowBuddyReqs 同模式)。翻译纯函数(ADR-008)。\n */\n\nimport type { OB11OfflineFileNoticeEvent } from \"../event/index.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/** 离线文件归一化项(收窄产物;字段名待真实事件校准)。 */\nexport interface OfflineFileLike {\n /** 发送者 uin(数字字符串;未知为 \"0\")。 */\n senderUin: string;\n name: string;\n size: number;\n /** 下载地址(未知为空串——OB11 offline_file 的 file.url 待校准数据源)。 */\n url: string;\n}\n\n/** 候选 uin 字段(按优先级取第一个数字串;uid 串不硬转——待校准)。 */\nfunction pickUin(item: Record<string, unknown>): string {\n for (const key of [\"senderUin\", \"fromUin\", \"peerUin\"]) {\n const v = item[key];\n if (typeof v === \"string\" && v !== \"\" && Number.isFinite(Number(v))) {\n return v;\n }\n }\n return \"0\";\n}\n\n/** 候选 url 字段(fileUrl / url;未知为空串)。 */\nfunction pickUrl(item: Record<string, unknown>): string {\n for (const key of [\"fileUrl\", \"url\"]) {\n const v = item[key];\n if (typeof v === \"string\" && v !== \"\") {\n return v;\n }\n }\n return \"\";\n}\n\n/** 单个候选对象 → 归一化项(不可识别返回 null)。接受两类形状:\n * ① RawMessage 型(elements[].fileElement——离线文件以消息推送到达的假设,\n * 与 onRecvOfflineFileMsg 挂在 MsgService、UpdateC2CFileMsg 字符串一致)\n * ② 专用实体型(顶层 fileName 或 fileInfo.fileName——getNewOfflineFileList 族) */\nfunction narrowItem(item: unknown): OfflineFileLike | null {\n if (typeof item !== \"object\" || item === null) {\n return null;\n }\n const obj = item as Record<string, unknown>;\n // ① RawMessage 型:fileElement 落在 elements 数组\n if (Array.isArray(obj[\"elements\"])) {\n const el = obj[\"elements\"].find(\n (e) => typeof e === \"object\" && e !== null && \"fileElement\" in e,\n ) as { fileElement?: Record<string, unknown> } | undefined;\n const file = el?.fileElement;\n if (file === undefined) {\n return null;\n }\n return {\n senderUin: pickUin(obj),\n name: typeof file[\"fileName\"] === \"string\" ? file[\"fileName\"] : \"\",\n size: Number(file[\"fileSize\"] ?? 0),\n url: pickUrl(file),\n };\n }\n // ② 专用实体型:顶层或 fileInfo 下的 fileName\n const file = (obj[\"fileInfo\"] as Record<string, unknown> | undefined) ?? obj;\n if (typeof file[\"fileName\"] !== \"string\") {\n return null;\n }\n return {\n senderUin: pickUin(obj),\n name: file[\"fileName\"],\n size: Number(file[\"fileSize\"] ?? 0),\n url: pickUrl(file),\n };\n}\n\n/**\n * onRecvOfflineFileMsg 参数 → 归一化项列表(防御性收窄)。\n * 接受数组 / 单对象;全部不可识别返回 null(调用方打 raw 日志)。\n * 空数组同样返回 null(无文件可翻译,与未知形状同走日志路径无害)。\n */\nexport function narrowOfflineFiles(arg: unknown): OfflineFileLike[] | null {\n const items = Array.isArray(arg) ? arg : [arg];\n const narrowed = items.map(narrowItem).filter((v): v is OfflineFileLike => v !== null);\n return narrowed.length > 0 ? narrowed : null;\n}\n\n/** 归一化项 → OB11 offline_file notice(time 取当前时刻,friend_add 同款)。 */\nexport function toOfflineFileNotice(\n item: OfflineFileLike,\n selfUin: string,\n): OB11OfflineFileNoticeEvent {\n return {\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(selfUin),\n post_type: \"notice\",\n notice_type: \"offline_file\",\n user_id: Number(item.senderUin),\n file: { name: item.name, size: item.size, url: item.url },\n };\n}\n","/**\n * OB11 sysmsg 解码与翻译(2026-09-10,design.md §7)\n *\n * Msg/onRecvSysMsg 是群名片/头衔/签到等系统事件的 sys msg 总闸,payload =\n * 原始 protobuf 字节(djinni int8 数组透传,实测 `[[10,64,…]]` 形状)。本模块:\n * - decodeProtoTree:手写 protobuf wire-format 解码器(varint/length-delimited,\n * 零依赖,BigInt 保 64 位精度)\n * - narrowSysMsgBlobs:回调参数防御性收窄(未知形状 → null,调用方打 raw 日志)\n * - extractSysMsgEnvelope:按实测样本布局提取信封(design.md §7.3,逐字段可空)\n * - recognizeSysMsg + KIND_TABLE:(msgType, subType) → 事件种类。\n * ⚠️ 表当前为空——card/title/sign 的判别值无样本支撑,宁可漏报不错报\n * (design.md §7.5);未识别一律走结构化校准日志,不广播。\n *\n * 证据:2 条真实样本(c3 观测窗 2026-09-09,各 151 字节,均为 528/382 未命名\n * 类型)+ wrapper.node OnSysMsg* 处理器分类学(strings 扫描,原生分发键 =\n * msg_type/sub_type)。翻译纯函数(ADR-008)。\n */\n\nimport type { OB11NoticeEvent } from \"../event/index.js\";\n\n// ---------------------------------------------------------------------------\n// wire-format 解码器\n// ---------------------------------------------------------------------------\n\n/** 递归深度上限(防御:恶意/畸形字节防栈溢出)。 */\nconst MAX_DEPTH = 16;\n\n/** 单层字段数上限。 */\nconst MAX_FIELDS = 256;\n\n/** 单个 varint 最大字节数(64 位 + 1 冗余)。 */\nconst MAX_VARINT_BYTES = 10;\n\n/** protobuf 字段树节点(判别联合)。 */\nexport type SysMsgField =\n | {\n readonly no: number;\n readonly kind: \"varint\";\n /** 原始 64 位值(BigInt;安全转换走 varintToNumber)。 */\n readonly value: bigint;\n }\n | {\n readonly no: number;\n readonly kind: \"bytes\";\n readonly value: Uint8Array;\n /** 子树(try-parse 成功时;null = 不透明字节,empty [] = 空消息)。 */\n readonly children: readonly SysMsgField[] | null;\n };\n\n/** 读 varint:成功返回 [值, 下一偏移],越界/超长返回 null。 */\nfunction readVarint(data: Uint8Array, start: number): [bigint, number] | null {\n let value = 0n;\n let shift = 0n;\n let i = start;\n while (true) {\n if (i >= data.length || i - start >= MAX_VARINT_BYTES) {\n return null;\n }\n const byte = data[i];\n if (byte === undefined) {\n return null;\n }\n i += 1;\n value |= BigInt(byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n return [value, i];\n }\n shift += 7n;\n }\n}\n\n/** 单字段解码产物:field = 产出节点(定长跳过类无产出),next = 下一偏移。 */\ninterface DecodedField {\n readonly field: SysMsgField | undefined;\n readonly next: number;\n}\n\n/** wire 2:length-delimited 字段(递归 try-parse 子树,失败 → 不透明字节)。 */\nfunction decodeLengthDelimited(\n data: Uint8Array,\n afterTag: number,\n no: number,\n depth: number,\n): DecodedField | null {\n const len = readVarint(data, afterTag);\n if (len === null) {\n return null;\n }\n const payloadStart = len[1];\n const end = payloadStart + Number(len[0]);\n if (end > data.length) {\n return null;\n }\n const slice = data.slice(payloadStart, end);\n return {\n field: { no, kind: \"bytes\", value: slice, children: decodeProtoTree(slice, depth + 1) },\n next: end,\n };\n}\n\n/** 解码单个带 tag 字段;畸形(field 0 / group / 截断 / 越界)返回 null。 */\nfunction decodeTaggedField(data: Uint8Array, start: number, depth: number): DecodedField | null {\n const tag = readVarint(data, start);\n if (tag === null) {\n return null;\n }\n const [tagValue, afterTag] = tag;\n const no = Number(tagValue >> 3n);\n const wireType = Number(tagValue & 7n);\n if (no === 0) {\n return null;\n }\n if (wireType === 0) {\n const v = readVarint(data, afterTag);\n if (v === null) {\n return null;\n }\n return { field: { no, kind: \"varint\", value: v[0] }, next: v[1] };\n }\n if (wireType === 2) {\n return decodeLengthDelimited(data, afterTag, no, depth);\n }\n if (wireType === 1 || wireType === 5) {\n const next = afterTag + (wireType === 1 ? 8 : 4);\n return next > data.length ? null : { field: undefined, next };\n }\n return null; // wire 3/4(group)未观测到,整层判失败\n}\n\n/**\n * 解码 protobuf wire-format 为递归字段树(不维护字段重复/顺序语义以外的信息)。\n *\n * - wire 0 varint / wire 2 length-delimited:支持;wire 2 递归 try-parse,\n * 子解析失败按不透明字节挂树(ASCII 串偶发误判嵌套无实害——树仅用于观测)。\n * - wire 1/5(fixed64/32):跳过(QQ NT blob 未观测到,防御性兼容)。\n * - wire 3/4(group)、截断、field 0、超限:判失败返回 null。\n */\nexport function decodeProtoTree(data: Uint8Array, depth = 0): readonly SysMsgField[] | null {\n if (depth > MAX_DEPTH) {\n return null;\n }\n const fields: SysMsgField[] = [];\n let i = 0;\n while (i < data.length) {\n if (fields.length >= MAX_FIELDS) {\n return null;\n }\n const decoded = decodeTaggedField(data, i, depth);\n if (decoded === null) {\n return null;\n }\n if (decoded.field !== undefined) {\n fields.push(decoded.field);\n }\n i = decoded.next;\n }\n return fields;\n}\n\n/** 取字段号首个命中的节点。 */\nfunction firstField(tree: readonly SysMsgField[], no: number): SysMsgField | undefined {\n return tree.find((f) => f.no === no);\n}\n\n/** varint → number(超安全整数返回 null,调用方按缺字段处理)。 */\nexport function varintToNumber(value: bigint): number | null {\n return value <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(value) : null;\n}\n\n/** UTF-8 严格解码 + 可打印检查(含控制字符判不可解码,返回 null)。 */\nfunction decodeText(bytes: Uint8Array): string | null {\n try {\n const text = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n for (const ch of text) {\n const code = ch.codePointAt(0) ?? 0;\n if (code < 0x20 && code !== 0x09) {\n return null;\n }\n }\n return text;\n } catch {\n return null;\n }\n}\n\n/** 递归收集树内全部可打印字符串(校准观测用;先序遍历,空字节段跳过)。 */\nexport function collectStrings(tree: readonly SysMsgField[]): string[] {\n const out: string[] = [];\n for (const f of tree) {\n if (f.kind === \"varint\") {\n continue;\n }\n const text = decodeText(f.value);\n if (text !== null && text.length > 0) {\n out.push(text);\n }\n if (f.children !== null) {\n out.push(...collectStrings(f.children));\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// 回调参数收窄(onRecvSysMsg arg = 带符号字节数组的数组,design.md §7.2)\n// ---------------------------------------------------------------------------\n\n/** 单个候选块 → Uint8Array(number[] -128..255 / TypedArray;其余 null)。 */\nfunction toBlob(item: unknown): Uint8Array | null {\n if (item instanceof Uint8Array) {\n return new Uint8Array(item);\n }\n if (item instanceof Int8Array) {\n return Uint8Array.from(item, (b) => b & 0xff);\n }\n if (Array.isArray(item) && item.length > 0) {\n const out = new Uint8Array(item.length);\n for (let i = 0; i < item.length; i += 1) {\n const b = item[i];\n // 非整数拒绝:浮点 & 0xff 会静默截断成别的字节\n if (typeof b !== \"number\" || !Number.isInteger(b) || b < -128 || b > 255) {\n return null;\n }\n out[i] = b & 0xff;\n }\n return out;\n }\n return null;\n}\n\n/**\n * onRecvSysMsg 参数 → sysmsg 字节块列表(防御性收窄)。\n * 接受批数组(实测形状)/ 单块裸数组 / TypedArray;零有效块返回 null\n * (调用方打 raw 日志,与 narrowOfflineFiles 同模式)。\n */\nexport function narrowSysMsgBlobs(arg: unknown): readonly Uint8Array[] | null {\n if (Array.isArray(arg)) {\n // 优先按「批」解释(实测:外层数组内层字节块)\n const blobs = arg.map(toBlob).filter((b): b is Uint8Array => b !== null);\n if (blobs.length > 0) {\n return blobs;\n }\n // 兜底:arg 本身是裸字节数组\n const single = toBlob(arg);\n return single === null ? null : [single];\n }\n const single = toBlob(arg);\n return single === null ? null : [single];\n}\n\n// ---------------------------------------------------------------------------\n// 信封提取(字段号依据 = design.md §7.3 样本观察,逐字段软失败)\n// ---------------------------------------------------------------------------\n\n/** 实测样本信封(全部可空 = 提取失败不打死整条事件)。 */\nexport interface SysMsgEnvelope {\n /** f1.f1:行为人 uin(观测 = 自身账号;语义待校准)。 */\n actorUin: number | null;\n /** f1.f2:行为人 uid。 */\n actorUid: string | null;\n /** f1.f5:对象 uin(观测与 actor 相等)。 */\n targetUin: number | null;\n /** f1.f6:对象 uid。 */\n targetUid: string | null;\n /** f2.f1:msgType(原生分发键之一)。 */\n msgType: number | null;\n /** f2.f2:subType(原生分发键之一)。 */\n subType: number | null;\n /** f2.f3:备用 subType(观测恒等于 subType)。 */\n subTypeAlt: number | null;\n /** f2.f4/f5:群标识对(观测恒相邻整数,语义待校准)。 */\n groupCodes: readonly [number, number] | null;\n /** f2.f6:事件时间戳(秒)。 */\n time: number | null;\n /** 树内全部可打印字符串(校准观测用,含 base64 文本)。 */\n strings: readonly string[];\n}\n\n/** 顶层 f1 块的字段(uin/uid 对)。 */\nfunction extractActorBlock(block: readonly SysMsgField[] | null): {\n uin: number | null;\n uid: string | null;\n uin2: number | null;\n uid2: string | null;\n} {\n const empty = { uin: null, uid: null, uin2: null, uid2: null };\n if (block === null) {\n return empty;\n }\n const f1 = firstField(block, 1);\n const f2 = firstField(block, 2);\n const f5 = firstField(block, 5);\n const f6 = firstField(block, 6);\n return {\n uin: f1?.kind === \"varint\" ? varintToNumber(f1.value) : null,\n uid: f2?.kind === \"bytes\" ? decodeText(f2.value) : null,\n uin2: f5?.kind === \"varint\" ? varintToNumber(f5.value) : null,\n uid2: f6?.kind === \"bytes\" ? decodeText(f6.value) : null,\n };\n}\n\n/** 顶层 f2 块 → 信封数值字段。 */\nfunction extractEnvelopeBlock(\n block: readonly SysMsgField[] | null,\n): Pick<SysMsgEnvelope, \"msgType\" | \"subType\" | \"subTypeAlt\" | \"groupCodes\" | \"time\"> {\n const empty = { msgType: null, subType: null, subTypeAlt: null, groupCodes: null, time: null };\n if (block === null) {\n return empty;\n }\n const num = (no: number): number | null => {\n const f = firstField(block, no);\n return f?.kind === \"varint\" ? varintToNumber(f.value) : null;\n };\n const code4 = num(4);\n const code5 = num(5);\n return {\n msgType: num(1),\n subType: num(2),\n subTypeAlt: num(3),\n groupCodes: code4 !== null && code5 !== null ? ([code4, code5] as const) : null,\n time: num(6),\n };\n}\n\n/** 字段树 → 信封(design.md §7.3;任何字段缺失/非法 = null,不抛错)。 */\nexport function extractSysMsgEnvelope(tree: readonly SysMsgField[]): SysMsgEnvelope {\n const actor = extractActorBlock(getChildren(firstField(tree, 1)));\n return {\n actorUin: actor.uin,\n actorUid: actor.uid,\n targetUin: actor.uin2,\n targetUid: actor.uid2,\n ...extractEnvelopeBlock(getChildren(firstField(tree, 2))),\n strings: collectStrings(tree),\n };\n}\n\n/** bytes 节点的子树(非 bytes/不透明 → null)。 */\nfunction getChildren(field: SysMsgField | undefined): readonly SysMsgField[] | null {\n return field?.kind === \"bytes\" ? field.children : null;\n}\n\n// ---------------------------------------------------------------------------\n// 识别层(design.md §7.5:不得猜错还硬广播)\n// ---------------------------------------------------------------------------\n\n/** sysmsg 可映射的 OB11 notice 种类(event/notice.ts 既有类型)。 */\nexport type SysMsgNoticeKind = \"group_card\" | \"group_title\" | \"group_sign\";\n\n/** 单条识别规则:表命中后从字段树提取广播体;提取失败 → null(降级校准日志)。 */\nexport interface SysMsgKindRule {\n readonly kind: SysMsgNoticeKind;\n extract(tree: readonly SysMsgField[], env: SysMsgEnvelope): OB11NoticeEvent | null;\n}\n\n/**\n * (msgType, subType) → 规则表,主键 `\"${msgType}:${subType}\"`(原生分发键,\n * design.md §7.1)。\n *\n * ⚠️ 当前为空:c3 以来的全部真实样本(2 条)均为 528/382 未命名类型,\n * card/title/sign 的判别值没有样本支撑——在此登记规则前不会广播任何 sysmsg\n * notice。拿到真实样本后登记 extract 规则即可(规则实现参考\n * notice-extra.ts 防御性收窄风格)。\n */\nconst KIND_TABLE: ReadonlyMap<string, SysMsgKindRule> = new Map();\n\n/** 已观测但未命名的 (msgType, subType):c3 双样本 528/382(语义未知)。 */\nconst OBSERVED_UNNAMED: ReadonlySet<string> = new Set([\"528:382\"]);\n\n/** 识别结果三态。 */\nexport type SysMsgRecognition =\n | { readonly kind: \"notice\"; readonly rule: SysMsgKindRule }\n | { readonly kind: \"observed_unnamed\" }\n | { readonly kind: \"unknown\" };\n\n/**\n * (msgType, subType) → 识别结果。table 参数供单测注入合成规则(生产走\n * KIND_TABLE)。\n */\nexport function recognizeSysMsg(\n msgType: number | null,\n subType: number | null,\n table: ReadonlyMap<string, SysMsgKindRule> = KIND_TABLE,\n): SysMsgRecognition {\n if (msgType === null || subType === null) {\n return { kind: \"unknown\" };\n }\n const rule = table.get(`${msgType}:${subType}`);\n if (rule !== undefined) {\n return { kind: \"notice\", rule };\n }\n return OBSERVED_UNNAMED.has(`${msgType}:${subType}`)\n ? { kind: \"observed_unnamed\" }\n : { kind: \"unknown\" };\n}\n\n/** 字节块 → 小写 hex(校准日志用;超长由调用方截断)。 */\nexport function toHex(bytes: Uint8Array): string {\n let out = \"\";\n for (const b of bytes) {\n out += b.toString(16).padStart(2, \"0\");\n }\n return out;\n}\n","/**\n * OB11 传输装配(P2-5,2026-08-05)\n *\n * 按 OB11Config 创建/装配 network 传输适配器:\n * - HTTP 反向(http.enabled):HttpServer 接收第三方调用 → handleRequest → 响应\n * - WS 反向(ws.enabled):WsServer 第三方连入 → handleRequest(echo 透传)+ 事件广播\n * - HTTP 正向(httpPost.enabled):HttpClient 事件上报(fire-and-forget)\n * - WS 正向(wsReverse.enabled):WsClient 主动连第三方(双向)\n *\n * 鉴权:token 存在时校验 Authorization: Bearer <token> / access_token 查询参数。\n * 返回 transports(事件上报用,注册到 broadcaster)与 close(停止时关闭全部)。\n */\nimport {\n type AuthorizeHook,\n type EventBroadcaster,\n HttpClient,\n HttpServer,\n type RequestContext,\n type TransportAdapter,\n WsClient,\n WsServer,\n} from \"@napuketto/network\";\nimport type { OB11Config } from \"./helper/index.js\";\n\n/** Authorization 头前缀。 */\nconst BEARER_PREFIX = \"Bearer \";\n\n/** 校验 URL 查询参数里的 access_token(WS client 连接 URL 可能带)。\n * ⚠️ req.url 是纯路径(无 origin),new URL(相对路径) 必抛——2026-09-08\n * T10 E2E 实测抓到的 bug(查询参数鉴权从未生效,WS 全被 4401 关闭),\n * 用 dummy base 解析。 */\nfunction hasAccessTokenQuery(url: string, token: string): boolean {\n try {\n const parsed = new URL(url, \"http://localhost\");\n return parsed.searchParams.get(\"access_token\") === token;\n } catch {\n return false;\n }\n}\n\n/** 校验 Authorization: Bearer <token> 头。 */\nfunction checkBearer(auth: string | undefined, token: string): boolean {\n if (auth === undefined || !auth.startsWith(BEARER_PREFIX)) {\n return false;\n }\n return auth.slice(BEARER_PREFIX.length) === token;\n}\n\n/** 构造鉴权钩子(token 未配置则不鉴权)。 */\nfunction makeAuthorize(token: string | undefined): AuthorizeHook | undefined {\n if (token === undefined || token === \"\") {\n return;\n }\n return (ctx: RequestContext): boolean => {\n const auth = ctx.headers[\"authorization\"] ?? ctx.headers[\"Authorization\"];\n if (checkBearer(auth, token) || ctx.headers[\"authorization\"] === token) {\n return true;\n }\n return hasAccessTokenQuery(ctx.url, token);\n };\n}\n\n/** 传输装配结果。 */\nexport interface Ob11TransportSet {\n /** 反向 server(HTTP/WS,第三方调用入口)。 */\n servers: TransportAdapter[];\n /** 事件上报传输(正向 client,已注册到 broadcaster)。 */\n transports: TransportAdapter[];\n /** 停止:关闭全部传输(幂等)。 */\n close: () => Promise<void>;\n}\n\n/** 传输装配选项。 */\nexport interface AssembleOb11TransportsOptions {\n /** OB11 配置。 */\n config: OB11Config;\n /** 事件广播(正向上报传输注册到它)。 */\n broadcaster: EventBroadcaster;\n /** 请求分发(adapter.handleRequest,HTTP/WS 共用)。 */\n handleRequest: (req: unknown, respond: (res: unknown) => void) => void;\n /** 机器人自身 uin(koishi 等第三方按 X-Self-ID 识别连接归属)。 */\n selfUin: string;\n}\n\n/**\n * OneBot 客户端标识头:koishi 的 onebot 适配器按\n * x-client-role === \"Universal\" 与 x-self-id 校验 WS 连接(NapCat 同款头),\n * 缺失会被 close(1008) 拒绝——连接虽握手成功但应用层不认。\n */\nfunction oneBotClientHeaders(selfUin: string): Record<string, string> {\n return {\n \"X-Self-ID\": selfUin,\n \"x-client-role\": \"Universal\",\n \"User-Agent\": \"OneBot/11\",\n };\n}\n\n/** 按配置装配 OB11 传输。 */\nexport function assembleOb11Transports(opts: AssembleOb11TransportsOptions): Ob11TransportSet {\n const { config, broadcaster, handleRequest, selfUin } = opts;\n const servers: TransportAdapter[] = [];\n const transports: TransportAdapter[] = [];\n\n assembleHttpServers(config, handleRequest, servers);\n assembleWsServers(config, handleRequest, servers);\n assembleHttpPosts(config, selfUin, transports);\n assembleWsReverses(config, selfUin, handleRequest, transports);\n\n // 注册事件上报传输(正向 client:HTTP 上报 / WS 正向)\n for (const t of transports) {\n broadcaster.register(t);\n }\n // 反向 server 也注册(2026-08-07 修复):反向 WS 客户端(koishi 等)连入后\n // 必须能收到事件广播(lifecycle/heartbeat/消息事件)。此前只注册正向传输,\n // 反向 WsServer 未注册 → 客户端连上后收不到任何事件(NapCat 语义:反向连接\n // 同样收广播)。HttpServer.send 为 no-op(HTTP 无推送),注册无害。\n for (const s of servers) {\n broadcaster.register(s);\n }\n\n return {\n servers,\n transports,\n close: async () => {\n await Promise.all([...servers, ...transports].map((t) => t.close()));\n for (const t of [...servers, ...transports]) {\n broadcaster.unregister(t);\n }\n },\n };\n}\n\n/** 装配 HTTP 反向 server 列表(每实例一个 HttpServer,共享 handleRequest)。 */\nfunction assembleHttpServers(\n config: OB11Config,\n handleRequest: (req: unknown, respond: (res: unknown) => void) => void,\n servers: TransportAdapter[],\n): void {\n for (const item of config.httpServers) {\n if (item.enabled) {\n const options: ConstructorParameters<typeof HttpServer>[0] = {\n host: item.host,\n port: item.port,\n };\n const authorize = makeAuthorize(item.token ?? config.token);\n if (authorize !== undefined) {\n options.authorize = authorize;\n }\n const server = new HttpServer(options);\n server.onRequest = handleRequest;\n servers.push(server);\n }\n }\n}\n\n/** 装配反向 WS server 列表(每实例一个 WsServer,心跳 ping + 鉴权)。 */\nfunction assembleWsServers(\n config: OB11Config,\n handleRequest: (req: unknown, respond: (res: unknown) => void) => void,\n servers: TransportAdapter[],\n): void {\n for (const item of config.wsServers) {\n if (item.enabled) {\n const options: ConstructorParameters<typeof WsServer>[0] = {\n host: item.host,\n port: item.port,\n heartbeat: { intervalMs: item.heartbeatInterval },\n };\n const authorize = makeAuthorize(item.token ?? config.token);\n if (authorize !== undefined) {\n options.authorize = authorize;\n }\n const server = new WsServer(options);\n server.onRequest = handleRequest;\n servers.push(server);\n }\n }\n}\n\n/** 装配 HTTP 正向上报 client 列表(fire-and-forget)。 */\nfunction assembleHttpPosts(\n config: OB11Config,\n selfUin: string,\n transports: TransportAdapter[],\n): void {\n for (const item of config.httpPostUrls) {\n if (item.enabled && item.url !== undefined) {\n // koishi HTTP 上报同样按 x-self-id 识别 bot(缺失返回 403)\n const headers = {\n \"x-self-id\": selfUin,\n ...(authorizeHeader(item.token ?? config.token) ?? {}),\n };\n const options: ConstructorParameters<typeof HttpClient>[0] = {\n url: item.url,\n headers,\n };\n if (item.timeoutMs !== undefined) {\n options.timeoutMs = item.timeoutMs;\n }\n transports.push(new HttpClient(options));\n }\n }\n}\n\n/** 装配正向 WS client 列表(双向,心跳 + 重连 + 证书选项)。 */\nfunction assembleWsReverses(\n config: OB11Config,\n selfUin: string,\n handleRequest: (req: unknown, respond: (res: unknown) => void) => void,\n transports: TransportAdapter[],\n): void {\n for (const item of config.wsReverseUrls) {\n if (item.enabled && item.url !== undefined) {\n // koishi 等第三方按 X-Self-ID / x-client-role 识别并校验连接(NapCat 同款头),\n // 与 authorization 合并后作为握手请求头\n const headers = {\n ...oneBotClientHeaders(selfUin),\n ...(authorizeHeader(item.token ?? config.token) ?? {}),\n };\n // 独立构造重连策略:maxAttempts 条件附加(exactOptionalPropertyTypes)\n const reconnect: { enabled: boolean; delayMs: number; maxAttempts?: number } = {\n enabled: true,\n delayMs: item.reconnectDelayMs,\n };\n if (item.maxReconnectAttempts !== undefined) {\n reconnect.maxAttempts = item.maxReconnectAttempts;\n }\n const options: ConstructorParameters<typeof WsClient>[0] = {\n url: item.url,\n headers,\n heartbeat: { intervalMs: item.heartbeatInterval },\n reconnect,\n rejectUnauthorized: item.rejectUnauthorized,\n };\n const client = new WsClient(options);\n client.onRequest = handleRequest;\n transports.push(client);\n }\n }\n}\n\n/** token → Authorization 头(client 上报/连接用)。 */\nfunction authorizeHeader(token: string | undefined): Record<string, string> | undefined {\n if (token === undefined || token === \"\") {\n return;\n }\n return { authorization: `${BEARER_PREFIX}${token}` };\n}\n","/**\n * NapukettoOneBot11Adapter:OneBot 11 协议适配器(P2-3:收发闭环)\n *\n * - 收链路:订阅 kernel 消息事件通道 → RawMessage 翻译 OB11 消息事件 → network 广播\n * - 发链路:handleRequest(OB11 标准 { action, params, echo })→ 动作注册表 → kernel apis\n *\n * 生命周期走 BaseProtocolAdapter 骨架(start 校验配置 → onStart 订阅 → stop 退订)。\n * 翻译为纯函数(ADR-008):只读入参(RawMessage),不调 API、不读缓存。\n */\n\nimport type {\n BuddyCacheEventChannel,\n BuddyEventChannel,\n BuddyReq,\n GroupEventChannel,\n GroupNotify,\n MsgEventChannel,\n RawMessage,\n} from \"@napuketto/kernel\";\nimport { ChatType, toCanonicalElements } from \"@napuketto/kernel\";\nimport type { EventBroadcaster } from \"@napuketto/network\";\nimport {\n type ActionRegistry,\n type ActionResult,\n BaseProtocolAdapter,\n type ProtocolConfig,\n} from \"../core/index.js\";\nimport { subscribeRawMessages } from \"../core/raw-message.js\";\nimport { createOb11ActionRegistry } from \"./action/index.js\";\nimport type { OneBotApiOptions } from \"./api/index.js\";\nimport { OneBotApi } from \"./api/index.js\";\nimport type { OB11Config } from \"./helper/index.js\";\nimport { collectReceiveNeeds, type ReceiveTranslateContext } from \"./helper/index.js\";\nimport { toOb11MessageEvent } from \"./helper/message-event.js\";\nimport {\n collectGrayTipUids,\n hasFileElement,\n hasGrayTip,\n toFriendAdd,\n toGroupUpload,\n toOb11NoticeEvent,\n} from \"./helper/notice.js\";\nimport { narrowOfflineFiles, toOfflineFileNotice } from \"./helper/notice-extra.js\";\nimport {\n narrowBuddyReqs,\n type RequestTranslateContext,\n toOb11FriendRequestEvent,\n toOb11GroupRequestEvent,\n} from \"./helper/request.js\";\nimport {\n decodeProtoTree,\n extractSysMsgEnvelope,\n narrowSysMsgBlobs,\n recognizeSysMsg,\n toHex,\n} from \"./helper/sysmsg.js\";\nimport type { Ob11TransportSet } from \"./transport.js\";\nimport { assembleOb11Transports } from \"./transport.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/**\n * info/warn 级 raw 字段截断上限(2026-10-25 输出内容治理):hex/base64/JSON\n * 原文对运行状态无信息量,保留前缀定位 + 缺省长度;完整值仅在 debug 级\n * ([log.levels].ob11 = \"debug\")与日志文件中出现。\n */\nconst RAW_INFO_LIMIT = 64;\n\n/** raw 字段截断:超限截断 + 缺省长度标注(…(+N))。 */\nfunction truncRaw(value: string | undefined, keep = RAW_INFO_LIMIT): string {\n if (value === undefined) {\n return \"\";\n }\n return value.length <= keep ? value : `${value.slice(0, keep)}…(+${value.length - keep})`;\n}\n\n/** 最小 logger 面(校准日志用:未知事件形状打 raw JSON;缺省静默)。 */\nexport interface AdapterLoggerLike {\n warn(obj: unknown, msg?: string): void;\n info(obj: unknown, msg?: string): void;\n /** 校准数据(2026-10-25 级别重分配:info → debug;此面必须支持)。 */\n debug(obj: unknown, msg?: string): void;\n}\n\n/** 适配器构造参数(api 相关字段继承 OneBotApiOptions,P2-16 聚合)。 */\nexport interface OneBot11AdapterOptions extends OneBotApiOptions {\n /** 协议配置(zod 校验 + JSON 读写)。 */\n config: ProtocolConfig<OB11Config>;\n /** network 事件广播(注册传输适配器后 emit 推给第三方)。 */\n broadcaster: EventBroadcaster;\n /** kernel 消息事件通道(消息收链路入口)。 */\n msgChannel: MsgEventChannel;\n /** kernel 群事件通道(可选:Group/onGroupNotifiesUpdated → OB11 request 源)。 */\n groupChannel?: GroupEventChannel;\n /** kernel 好友事件通道(可选:Buddy/onBuddyReqChange → OB11 request 源)。 */\n friendChannel?: BuddyEventChannel;\n /** 好友缓存 diff 通道(可选:BuddyCache/onBuddyAdded → OB11 friend_add 源,B2)。 */\n buddyCacheEvents?: BuddyCacheEventChannel;\n /** 校准日志(可选:未知事件形状 raw JSON;IPC 模式传 loader pino 实例)。 */\n logger?: AdapterLoggerLike;\n}\n\n/** OneBot 11 协议适配器。 */\nexport class NapukettoOneBot11Adapter extends BaseProtocolAdapter<OB11Config> {\n readonly protocol = \"onebot11\";\n\n private readonly msgChannel: MsgEventChannel;\n private readonly groupChannel: GroupEventChannel | undefined;\n private readonly friendChannel: BuddyEventChannel | undefined;\n private readonly buddyCacheEvents: BuddyCacheEventChannel | undefined;\n private readonly calibLogger: AdapterLoggerLike | undefined;\n private readonly selfUin: string;\n private readonly oneBotApi: OneBotApi;\n /** 动作注册表(公共只读:IPC 桥等装配方枚举动作名直接挂载)。 */\n readonly registry: ActionRegistry;\n private unsubscribes: Array<() => void> = [];\n private transports: Ob11TransportSet | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private reportSelfMessage = false;\n private messageFormat: \"array\" | \"string\" = \"array\";\n /** 群文件报形式(B4):true = fileElement 群消息报 group_upload notice 替代 message。 */\n private groupUploadAsNotice = false;\n /** IPC 桥模式标记(subscribeOnly 启动;reload 时跳过传输重建)。 */\n private subscribedOnly = false;\n\n constructor(opts: OneBot11AdapterOptions) {\n super({\n config: opts.config,\n broadcaster: opts.broadcaster,\n hooks: {\n onStart: (config) => this.startTransports(config as OB11Config),\n onStop: () => this.stopAll(),\n onReload: (config) => this.reloadTransports(config as OB11Config),\n },\n });\n this.msgChannel = opts.msgChannel;\n this.groupChannel = opts.groupChannel;\n this.friendChannel = opts.friendChannel;\n this.buddyCacheEvents = opts.buddyCacheEvents;\n this.calibLogger = opts.logger;\n this.selfUin = opts.self.uin;\n this.oneBotApi = new OneBotApi(opts);\n this.registry = createOb11ActionRegistry({ api: this.oneBotApi });\n }\n\n /**\n * 配置热更新(P2-6,2026-09-08 实现):stop 旧传输/心跳/退订 → 按新配置重建。\n * IPC 桥模式(subscribeOnly,无传输)只刷新上报开关字段,不重建。\n */\n private async reloadTransports(config: OB11Config): Promise<void> {\n if (this.subscribedOnly) {\n this.reportSelfMessage = config.reportSelfMessage;\n this.messageFormat = config.messagePostFormat;\n this.groupUploadAsNotice = config.groupUploadAsNotice;\n return;\n }\n await this.stopAll();\n await this.startTransports(config);\n }\n\n /** 启动传输:装配(HTTP/WS)+ 打开 server/client + 广播 lifecycle enable + 起心跳。 */\n private async startTransports(config: OB11Config): Promise<void> {\n // start() 即装传输:脱离 IPC 桥模式(复查发现的潜在混用序,防御复位)\n this.subscribedOnly = false;\n // 全局上报开关与消息格式(订阅处消费)\n this.reportSelfMessage = config.reportSelfMessage;\n this.messageFormat = config.messagePostFormat;\n this.groupUploadAsNotice = config.groupUploadAsNotice;\n const broadcaster = this.getBroadcaster();\n if (broadcaster !== undefined) {\n this.transports = assembleOb11Transports({\n config,\n broadcaster,\n selfUin: this.selfUin,\n handleRequest: (req, respond) => {\n this.handleRequest(req, respond).catch((err: unknown) => {\n let message = String(err);\n if (err instanceof Error) {\n message = err.message;\n }\n respond({ status: \"failed\", retcode: 999, data: null, message });\n });\n },\n });\n // 打开 server + 正向 client\n await Promise.all(this.transports.servers.map((s) => s.open()));\n await Promise.all(this.transports.transports.map((t) => t.open()));\n }\n this.subscribe();\n // lifecycle: enable\n this.broadcastEvent({\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(this.selfUin),\n post_type: \"meta_event\",\n meta_event_type: \"lifecycle\",\n sub_type: \"enable\",\n });\n // 心跳\n this.startHeartbeat(config.heartbeatInterval);\n }\n\n /** 心跳 meta 事件(interval 毫秒,0 关闭)。 */\n private startHeartbeat(intervalMs: number): void {\n if (intervalMs <= 0) {\n return;\n }\n this.heartbeatTimer = setInterval(() => {\n this.broadcastEvent({\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(this.selfUin),\n post_type: \"meta_event\",\n meta_event_type: \"heartbeat\",\n interval: intervalMs,\n status: { online: true, good: true },\n });\n }, intervalMs);\n }\n\n /** 停止:心跳 + 传输 + 退订。 */\n private async stopAll(): Promise<void> {\n if (this.heartbeatTimer !== null) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n this.unsubscribeAll();\n if (this.transports !== null) {\n await this.transports.close();\n this.transports = null;\n }\n }\n\n /** 订阅 kernel 事件(消息 + 群通知 + 好友请求,幂等)。 */\n private subscribe(): void {\n if (this.unsubscribes.length > 0) {\n return;\n }\n // onRecvMsg 回调参数为消息数组(2026-08-07 运行时实证)——遍历逐条翻译。\n this.unsubscribes.push(\n subscribeRawMessages(this.msgChannel, (msg) => {\n // grayTip(系统事件)→ notice;否则 → 消息事件\n if (hasGrayTip(msg)) {\n this.broadcastNotice(msg).catch(() => {\n // notice 翻译失败静默(grayTip 解析宽容)\n });\n return;\n }\n // 自身消息:默认不上报(OB11 规范行为;reportSelfMessage=true 时上报)\n if (!this.reportSelfMessage && String(msg.senderUin) === this.selfUin) {\n return;\n }\n // 群文件报形式开关(B4):on = group_upload notice 替代 message 事件\n if (\n this.groupUploadAsNotice &&\n msg.chatType === ChatType.GROUP &&\n hasFileElement(msg)\n ) {\n const notice = toGroupUpload(msg, this.selfUin);\n if (notice !== null) {\n this.broadcastEvent(notice);\n return;\n }\n }\n void this.broadcastMessageEvent(msg);\n }),\n );\n // 离线文件(c3,2026-09-10):Msg/onRecvOfflineFileMsg → OB11 offline_file\n // notice(payload 形状待校准:防御性收窄,未知形状 raw 日志积累)\n this.unsubscribes.push(\n this.msgChannel.on(\"Msg/onRecvOfflineFileMsg\", (arg) => {\n const items = narrowOfflineFiles(arg);\n if (items === null) {\n this.calibLogger?.warn(\n { raw: truncRaw(JSON.stringify(arg)) },\n \"ob11: onRecvOfflineFileMsg 未知参数形状\",\n );\n return;\n }\n for (const item of items) {\n this.broadcastEvent(toOfflineFileNotice(item, this.selfUin));\n }\n }),\n );\n // sys msg 总闸(c3 接线;2026-09-10 解码回填,design.md §7):\n // 解码 → 识别 → 表命中才广播;未识别走结构化校准日志。\n // ⚠️ 识别表当前为空(card/title/sign 判别值无样本支撑)= 全部校准日志。\n this.unsubscribes.push(\n this.msgChannel.on(\"Msg/onRecvSysMsg\", (arg) => {\n const blobs = narrowSysMsgBlobs(arg);\n if (blobs === null) {\n this.calibLogger?.warn(\n { raw: truncRaw(JSON.stringify(arg)) },\n \"ob11: onRecvSysMsg 未知参数形状\",\n );\n return;\n }\n for (const blob of blobs) {\n this.handleSysMsgBlob(blob);\n }\n }),\n );\n // 在线文件:raw 校准日志(OB11 无对应通知类型;debug 级,2026-10-25)\n this.unsubscribes.push(\n this.msgChannel.on(\"Msg/onRecvOnlineFileMsg\", (arg) => {\n this.calibLogger?.debug(\n { raw: JSON.stringify(arg)?.slice(0, 2000) },\n \"ob11: onRecvOnlineFileMsg raw(校准数据)\",\n );\n }),\n );\n // 群系统通知 → OB11 group request(仅未处理的邀请/申请;doubt 可疑通知跳过)\n if (this.groupChannel !== undefined) {\n this.unsubscribes.push(\n this.groupChannel.on(\"Group/onGroupNotifiesUpdated\", (doubt, notifies) => {\n if (doubt || !Array.isArray(notifies)) {\n return;\n }\n void this.broadcastGroupRequests(notifies);\n }),\n );\n // 群精华列表变化(c3,2026-09-10):raw 校准日志(OB11 group_essence\n // 候选源;真实 payload 到达后回填翻译;debug 级,2026-10-25)\n this.unsubscribes.push(\n this.groupChannel.on(\"Group/onGroupEssenceListChange\", (arg) => {\n this.calibLogger?.debug(\n { raw: truncRaw(JSON.stringify(arg)) },\n \"ob11: onGroupEssenceListChange raw(group_essence 校准数据)\",\n );\n }),\n );\n }\n // 好友申请 → OB11 friend request(参数形状待真实事件校准,防御性收窄)\n if (this.friendChannel !== undefined) {\n this.unsubscribes.push(\n this.friendChannel.on(\"Buddy/onBuddyReqChange\", (arg) => {\n const reqs = narrowBuddyReqs(arg);\n if (reqs === null) {\n // 未知形状:raw 日志积累校准数据(T10 实测后回填 narrowBuddyReqs)\n this.calibLogger?.warn(\n { raw: truncRaw(JSON.stringify(arg)) },\n \"ob11: onBuddyReqChange 未知参数形状\",\n );\n return;\n }\n void this.broadcastFriendRequests(reqs);\n }),\n );\n // 好友列表变化:T10 实证 = BuddyCategory[] 全量快照(翻译走 kernel\n // BuddyCache diff,见下方 buddyCacheEvents);此处 raw 日志保留积累\n // 校准数据(快照字段较多,slice 截断)\n for (const evt of [\"Buddy/onBuddyListChange\", \"Buddy/onBuddyListChangedV2\"] as const) {\n this.unsubscribes.push(\n this.friendChannel.on(evt, (arg) => {\n this.calibLogger?.info(\n { raw: truncRaw(JSON.stringify(arg)) },\n `ob11: ${evt} raw(friend_add 校准数据)`,\n );\n }),\n );\n }\n }\n // 好友缓存 diff(B2,2026-09-08):快照对比出的新增 → friend_add notice。\n // diff/baseline 逻辑在 kernel BuddyCache(onBuddyListChange 全量快照,\n // 首帧只建 baseline),adapter 翻译保持纯函数。\n if (this.buddyCacheEvents !== undefined) {\n this.unsubscribes.push(\n this.buddyCacheEvents.on(\"BuddyCache/onBuddyAdded\", (entry) => {\n this.broadcastEvent(toFriendAdd(entry, this.selfUin));\n }),\n );\n }\n }\n\n /**\n * 仅启动接收链路(IPC 桥模式,2026-08-27):订阅消息通道维护 messageUnique +\n * 灰色通知翻译,与 start() 的差别仅在传输层——不装配 HTTP/WS、不起心跳、\n * 不广播 lifecycle。配置经 seed 装配(load() 返回内存初值)。\n */\n async subscribeOnly(): Promise<void> {\n const config = await this.config.load();\n this.reportSelfMessage = config.reportSelfMessage;\n this.messageFormat = config.messagePostFormat;\n this.groupUploadAsNotice = config.groupUploadAsNotice;\n this.subscribedOnly = true;\n this.subscribe();\n }\n\n /** 仅退订(与 subscribeOnly 配对的进程级清理;传输关闭仍走 stop())。 */\n unsubscribeOnly(): void {\n this.subscribedOnly = false;\n this.unsubscribeAll();\n }\n\n /**\n * 单条 sysmsg 字节块:解码 → 识别 → 命中才广播,未识别打结构化校准日志\n * (识别表为空时全部走日志路径,design.md §7.5)。\n */\n private handleSysMsgBlob(blob: Uint8Array): void {\n const tree = decodeProtoTree(blob);\n if (tree === null) {\n this.calibLogger?.warn(\n { raw: truncRaw(toHex(blob).slice(0, 1024)) },\n \"ob11: onRecvSysMsg protobuf 解码失败\",\n );\n return;\n }\n const env = extractSysMsgEnvelope(tree);\n const rec = recognizeSysMsg(env.msgType, env.subType);\n if (rec.kind === \"notice\") {\n const event = rec.rule.extract(tree, env);\n if (event !== null) {\n this.broadcastEvent(event);\n return;\n }\n // 提取失败:降级校准日志(不硬广播半成品事件)\n }\n // 校准遥测(协议逆向用):info/warn 级不出(2026-10-25 级别重分配 + 截断),\n // debug 级保留全量字段(含 raw hex)供校准采集\n this.calibLogger?.debug(\n {\n verdict: rec.kind,\n msgType: env.msgType,\n subType: env.subType,\n subTypeAlt: env.subTypeAlt,\n groupCodes: env.groupCodes,\n time: env.time,\n actorUin: env.actorUin,\n actorUid: env.actorUid,\n strings: env.strings,\n raw: toHex(blob).slice(0, 1024),\n },\n \"ob11: onRecvSysMsg 校准数据(未识别,不广播)\",\n );\n }\n\n /**\n * 广播消息事件(P2-19:接收方向 ID 转换)。\n * 收集 at uid → 一次批量 uidToUin → 构造上下文 → 翻译广播。\n * 群消息另查发送者角色(GroupCache 缓存优先,失败回退缺省 member)。\n * 翻译失败退化为原样(不阻塞上报)。\n */\n private async broadcastMessageEvent(msg: RawMessage): Promise<void> {\n const elements = toCanonicalElements(msg);\n const { atUids } = collectReceiveNeeds(elements);\n let uidToUin: Map<string, string> | undefined;\n if (atUids.length > 0) {\n try {\n uidToUin = await this.oneBotApi.uidToUin(atUids);\n } catch {\n // uid 解析失败:at 原样(uid),不阻塞事件上报\n }\n }\n const senderRole =\n msg.chatType === ChatType.GROUP\n ? await this.oneBotApi.groupMemberRole(msg.peerUid, msg.senderUid)\n : undefined;\n const ctx: ReceiveTranslateContext = {\n ...(uidToUin !== undefined ? { uidToUin } : {}),\n ...(senderRole !== undefined ? { senderRole } : {}),\n msgIdToOb11Id: (msgId) => this.oneBotApi.messageUnique.getMessageId(msgId),\n };\n this.broadcastEvent(\n toOb11MessageEvent(\n msg,\n this.selfUin,\n this.oneBotApi.messageUnique,\n this.messageFormat,\n ctx,\n ),\n );\n }\n\n /** 广播 grayTip → notice 事件(批量 uidToUin 后翻译,纯函数)。 */\n private async broadcastNotice(msg: RawMessage): Promise<void> {\n const uids = collectGrayTipUids(msg);\n let uidToUin = new Map<string, string>();\n if (uids.length > 0) {\n uidToUin = await this.oneBotApi.uidToUin(uids);\n }\n const notice = toOb11NoticeEvent(msg, {\n selfUin: this.selfUin,\n uidToUin,\n ...(this.calibLogger !== undefined ? { logger: this.calibLogger } : {}),\n });\n if (notice !== null) {\n this.broadcastEvent(notice);\n }\n }\n\n /** 广播群系统通知 → OB11 group request 事件(批量 uidToUin 后翻译,纯函数)。 */\n private async broadcastGroupRequests(notifies: unknown[]): Promise<void> {\n const ctx: RequestTranslateContext = {\n selfUin: this.selfUin,\n uidToUin: await this.uidToUinMap(collectGroupNotifyUids(notifies)),\n };\n for (const n of notifies) {\n const event = toOb11GroupRequestEvent(n as GroupNotify, ctx);\n if (event !== null) {\n this.broadcastEvent(event);\n }\n }\n }\n\n /** 广播好友申请 → OB11 friend request 事件(批量 uidToUin 后翻译,纯函数)。 */\n private async broadcastFriendRequests(reqs: BuddyReq[]): Promise<void> {\n const ctx: RequestTranslateContext = {\n selfUin: this.selfUin,\n uidToUin: await this.uidToUinMap(\n reqs.map((r) => r.friendUid).filter((uid) => uid !== \"\"),\n ),\n };\n for (const req of reqs) {\n this.broadcastEvent(toOb11FriendRequestEvent(req, ctx));\n }\n }\n\n /** uid 批量 → uin(失败退空 Map:翻译层退化为 uid 数值,不阻塞请求上报)。 */\n private async uidToUinMap(uids: string[]): Promise<Map<string, string>> {\n if (uids.length === 0) {\n return new Map();\n }\n try {\n return await this.oneBotApi.uidToUin(uids);\n } catch {\n return new Map();\n }\n }\n\n /** 退订(幂等)。 */\n private unsubscribeAll(): void {\n for (const off of this.unsubscribes) {\n off();\n }\n this.unsubscribes = [];\n }\n\n /**\n * 请求分发(挂到 network transport 的 onRequest):\n * OB11 标准请求 { action, params, echo } → 动作注册表 → handle(HTTP)/websocketHandle(WS)。\n */\n async handleRequest(req: unknown, respond: (res: unknown) => void): Promise<void> {\n const parsed = (req ?? {}) as { action?: unknown; params?: unknown; echo?: unknown };\n // params 缺省 {}(OB11 规范允许省略;schema 校验在动作内,此处不判类型)\n const { action: rawAction, echo } = parsed;\n const params = parsed.params ?? {};\n let action = \"\";\n if (typeof rawAction === \"string\") {\n action = rawAction;\n }\n if (action === \"\") {\n respond({\n status: \"failed\",\n retcode: 404,\n data: null,\n message: \"请求缺少 action\",\n });\n return;\n }\n const act = this.registry.get(action);\n if (act === undefined) {\n respond({\n status: \"failed\",\n retcode: 404,\n data: null,\n message: `未知动作: ${action}`,\n });\n return;\n }\n let result: ActionResult<unknown>;\n if (echo === undefined) {\n result = await act.handle(params);\n } else {\n result = await act.websocketHandle(params, echo);\n }\n respond(result);\n }\n}\n\n/** 收集群系统通知涉及的 uid(user1/user2 双方,空 uid 跳过)。 */\nfunction collectGroupNotifyUids(notifies: unknown[]): string[] {\n const uids: string[] = [];\n for (const n of notifies) {\n const notify = n as { user1?: { uid?: unknown }; user2?: { uid?: unknown } };\n for (const u of [notify.user1, notify.user2]) {\n if (typeof u?.uid === \"string\" && u.uid !== \"\") {\n uids.push(u.uid);\n }\n }\n }\n return uids;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["DEFAULT_COUNT","DEFAULT_COUNT","DEFAULT_COUNT","MS_TO_SEC","MS_TO_SEC","toUin","MS_TO_SEC","DEFAULT_DOMAIN","STATUS_ONLINE","MS_TO_SEC","MS_TO_SEC","recognizeSysMsgCore"],"sources":["../../src/onebot11/action/error-map.ts","../../src/onebot11/action/resolve-uid.ts","../../src/onebot11/action/friend/delete-friend.ts","../../src/onebot11/action/friend/get-doubt-friends-add-request.ts","../../src/onebot11/action/friend/get-friend-list.ts","../../src/onebot11/action/friend/get-friends-with-category.ts","../../src/onebot11/action/friend/get-stranger-info.ts","../../src/onebot11/action/friend/send-like.ts","../../src/onebot11/action/friend/set-doubt-friends-add-request.ts","../../src/onebot11/action/friend/set-friend-add-request.ts","../../src/onebot11/action/friend/set-friend-remark.ts","../../src/onebot11/helper/message-unique.ts","../../src/onebot11/action/group/set-essence-msg.ts","../../src/onebot11/action/group/delete-essence-msg.ts","../../src/onebot11/action/group/get-essence-msg-list.ts","../../src/onebot11/action/group/get-group-add-request.ts","../../src/onebot11/action/group/get-group-at-all-remain.ts","../../src/onebot11/action/group/get-group-honor-info.ts","../../src/onebot11/helper/translate.ts","../../src/onebot11/action/group/get-group-info.ts","../../src/onebot11/action/group/get-group-list.ts","../../src/onebot11/action/group/get-group-member-info.ts","../../src/onebot11/action/group/get-group-member-list.ts","../../src/onebot11/action/group/get-group-shut-list.ts","../../src/onebot11/action/group/get-group-system-msg.ts","../../src/onebot11/action/group/group-files-op.ts","../../src/onebot11/action/group/group-files-query.ts","../../src/onebot11/action/group/set-group-add-request.ts","../../src/onebot11/action/group/set-group-admin.ts","../../src/onebot11/action/group/set-group-ban.ts","../../src/onebot11/action/group/set-group-card.ts","../../src/onebot11/action/group/set-group-kick.ts","../../src/onebot11/action/group/set-group-leave.ts","../../src/onebot11/action/group/set-group-name.ts","../../src/onebot11/action/group/set-group-whole-ban.ts","../../src/onebot11/action/message/delete-msg.ts","../../src/onebot11/action/message/fetch-ptt-text.ts","../../src/onebot11/action/message/resolve-peer.ts","../../src/onebot11/action/message/forward-single-msg.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/helper/message-info.ts","../../src/onebot11/helper/notice.ts","../../src/onebot11/helper/request.ts","../../src/onebot11/action/message/get-forward-msg.ts","../../src/onebot11/action/message/msg-history.ts","../../src/onebot11/action/message/get-friend-msg-history.ts","../../src/onebot11/action/message/get-group-msg-history.ts","../../src/onebot11/action/message/get-media.ts","../../src/onebot11/action/message/get-msg.ts","../../src/onebot11/action/message/mark-msg-as-read.ts","../../src/onebot11/action/message/mark-msg-as-read-aliases.ts","../../src/onebot11/action/message/send-forward-msg.ts","../../src/onebot11/action/message/send-msg.ts","../../src/onebot11/action/message/send-group-msg.ts","../../src/onebot11/action/message/send-private-msg.ts","../../src/onebot11/action/message/set-input-status.ts","../../src/onebot11/action/message/set-msg-emoji-like.ts","../../src/onebot11/action/system/can-send-image.ts","../../src/onebot11/action/system/can-send-record.ts","../../src/onebot11/action/system/clean-cache.ts","../../src/onebot11/action/system/download-file.ts","../../src/onebot11/action/system/get-clientkey.ts","../../src/onebot11/action/system/get-cookies.ts","../../src/onebot11/action/system/get-credentials.ts","../../src/onebot11/action/system/get-login-info.ts","../../src/onebot11/action/system/get-robot-uin-range.ts","../../src/onebot11/action/system/get-status.ts","../../src/onebot11/action/system/get-version-info.ts","../../src/onebot11/action/system/process-control.ts","../../src/onebot11/action/system/profile-actions.ts","../../src/onebot11/action/system/set-diy-online-status.ts","../../src/onebot11/action/system/set-online-status.ts","../../src/onebot11/action/system/translate-en2zh.ts","../../src/onebot11/action/index.ts","../../src/onebot11/api/one-bot-api.ts","../../src/onebot11/helper/message-event.ts","../../src/onebot11/helper/notice-extra.ts","../../src/onebot11/helper/sysmsg.ts","../../src/onebot11/transport.ts","../../src/onebot11/adapter.ts"],"sourcesContent":["/**\n * OB11 错误码映射表(ADR-017:协议层只维护映射,不解析逻辑)\n *\n * kernel 抛 KernelError(带 KernelErrorCode),各协议维护一份\n * KernelErrorCode → 协议错误码 的映射;BaseAction 统一做映射。\n */\n\nimport type { ErrorCodeMap } from \"../../core/index.js\";\n\n/** OB11 错误码映射表(send_msg 等所有 OB11 动作共用)。 */\nexport const ob11ErrorCodeMap: ErrorCodeMap = {\n SEND_FAILED: 100,\n PERMISSION_DENIED: 101,\n NOT_FOUND: 102,\n TIMEOUT: 103,\n NOT_LOGIN: 104,\n INVALID_PARAM: 105,\n INVALID_STATE: 106,\n UNKNOWN: 999,\n};\n","/**\n * OB11 用户 ID 解析(uin → uid,多个动作共用,2026-08-08 克隆合并)\n */\n\nimport { kernelError } from \"@napuketto/kernel\";\n\n/** 解析单个 uin → uid(失败抛 KernelError INVALID_PARAM)。 */\nexport async function resolveUid(\n uin: string,\n uinToUid: (uins: string[]) => Promise<Map<string, string>>,\n): Promise<string> {\n const uidMap = await uinToUid([uin]);\n const uid = uidMap.get(uin);\n if (uid === undefined) {\n throw kernelError(`用户 ${uin} 的 uid 解析失败`, \"INVALID_PARAM\");\n }\n return uid;\n}\n","/**\n * delete_friend 动作:删除好友(P2-11 接 kernel FriendApi.deleteFriend)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst deleteFriendSchema = z.object({\n user_id: z.number(),\n});\n\ntype DeleteFriendPayload = z.infer<typeof deleteFriendSchema>;\n\n/** 删除好友(P2-11 接 kernel deleteFriend)。 */\nexport class DeleteFriendAction extends BaseAction<DeleteFriendPayload, null> {\n readonly name = \"delete_friend\";\n readonly schema = deleteFriendSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"friendApi\" | \"uinToUid\">;\n\n constructor(deps: Pick<OneBotApi, \"friendApi\" | \"uinToUid\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: DeleteFriendPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n await this.deps.friendApi.deleteFriend(uid);\n return null;\n }\n}\n","/**\n * get_doubt_friends_add_request 动作:获取可疑好友申请(NapCat 扩展,P2-11)\n */\n\nimport type { DoubtFriendRequestInfo, FriendApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getDoubtFriendsAddRequestSchema = z.object({\n count: z.number().optional(),\n});\n\ntype GetDoubtFriendsAddRequestPayload = z.infer<typeof getDoubtFriendsAddRequestSchema>;\n\n/** 默认获取数量。 */\nconst DEFAULT_COUNT = 50;\n\n/** 获取可疑好友申请(P2-11 接 kernel getDoubtFriendRequest)。 */\nexport class GetDoubtFriendsAddRequestAction extends BaseAction<\n GetDoubtFriendsAddRequestPayload,\n DoubtFriendRequestInfo[]\n> {\n readonly name = \"get_doubt_friends_add_request\";\n readonly schema = getDoubtFriendsAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly friendApi: FriendApi;\n\n constructor(friendApi: FriendApi) {\n super();\n this.friendApi = friendApi;\n }\n\n protected _handle(\n payload: GetDoubtFriendsAddRequestPayload,\n ): Promise<DoubtFriendRequestInfo[]> {\n return this.friendApi.getDoubtFriendRequest(payload.count ?? DEFAULT_COUNT);\n }\n}\n","/**\n * get_friend_list 动作:获取好友列表(P2-4 接 kernel FriendApi)\n */\n\nimport type { FriendApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { FriendInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getFriendListSchema = z.object({\n /** 是否忽略缓存(go-cqhttp 扩展)。 */\n no_cache: z.boolean().optional(),\n});\n\ntype GetFriendListPayload = z.infer<typeof getFriendListSchema>;\n\n/** 获取好友列表(P2-4 接 kernel apis/friend)。 */\nexport class GetFriendListAction extends BaseAction<GetFriendListPayload, FriendInfo[]> {\n readonly name = \"get_friend_list\";\n readonly schema = getFriendListSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly friendApi: FriendApi;\n\n constructor(friendApi: FriendApi) {\n super();\n this.friendApi = friendApi;\n }\n\n protected async _handle(_payload: GetFriendListPayload): Promise<FriendInfo[]> {\n const friends = await this.friendApi.getFriendList();\n return friends.map((f) => {\n const info: FriendInfo = {\n user_id: Number(f.uin),\n nickname: f.nickname,\n };\n if (f.remark !== \"\") {\n info.remark = f.remark;\n }\n return info;\n });\n }\n}\n","/**\n * get_friends_with_category 动作:获取好友列表(含分类,NapCat 扩展,P2-11)\n *\n * 返回分类结构:categoryId / categorySortId / categoryName / categoryMbCount /\n * onlineCount / buddyList(Friend[]:uin/nickname/remark)。\n */\n\nimport type { FriendApi, FriendCategory } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getFriendsWithCategorySchema = z.object({});\n\ntype GetFriendsWithCategoryPayload = z.infer<typeof getFriendsWithCategorySchema>;\n\n/** 获取好友列表(含分类,P2-11 接 kernel getFriendCategories)。 */\nexport class GetFriendsWithCategoryAction extends BaseAction<\n GetFriendsWithCategoryPayload,\n FriendCategory[]\n> {\n readonly name = \"get_friends_with_category\";\n readonly schema = getFriendsWithCategorySchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly friendApi: FriendApi;\n\n constructor(friendApi: FriendApi) {\n super();\n this.friendApi = friendApi;\n }\n\n protected _handle(_payload: GetFriendsWithCategoryPayload): Promise<FriendCategory[]> {\n return this.friendApi.getFriendCategories();\n }\n}\n","/**\n * get_stranger_info 动作:获取陌生人信息(P2-15 接 kernel ProfileApi.getStrangerInfo)\n */\nimport type { ProfileApi, StrangerInfo } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getStrangerInfoSchema = z.object({\n user_id: z.number(),\n no_cache: z.boolean().optional(),\n});\n\ntype GetStrangerInfoPayload = z.infer<typeof getStrangerInfoSchema>;\n\n/** 获取陌生人信息(P2-15 接 kernel ProfileApi)。 */\nexport class GetStrangerInfoAction extends BaseAction<GetStrangerInfoPayload, StrangerInfo> {\n readonly name = \"get_stranger_info\";\n readonly schema = getStrangerInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly profileApi: ProfileApi;\n\n constructor(profileApi: ProfileApi) {\n super();\n this.profileApi = profileApi;\n }\n\n protected async _handle(payload: GetStrangerInfoPayload): Promise<StrangerInfo> {\n const info = await this.profileApi.getStrangerInfo(String(payload.user_id));\n return {\n ...info,\n user_id: payload.user_id,\n };\n }\n}\n","/**\n * send_like 动作:点赞(P2-14 接 kernel ProfileLikeApi.sendLike)\n */\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst sendLikeSchema = z.object({\n user_id: z.number(),\n times: z.number().optional(),\n});\n\ntype SendLikePayload = z.infer<typeof sendLikeSchema>;\n\n/** send_like 依赖(uinToUid 转 uid,OneBotApi 视图)。 */\nexport type SendLikeDeps = Pick<OneBotApi, \"profileLikeApi\" | \"uinToUid\">;\n\n/** 点赞(P2-14 接 kernel ProfileLikeApi)。 */\nexport class SendLikeAction extends BaseAction<SendLikePayload, null> {\n readonly name = \"send_like\";\n readonly schema = sendLikeSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SendLikeDeps;\n\n constructor(deps: SendLikeDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SendLikePayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n await this.deps.profileLikeApi.sendLike(uid, payload.times ?? 1);\n return null;\n }\n}\n","/**\n * set_doubt_friends_add_request 动作:处理可疑好友申请(NapCat 扩展,P2-11)\n *\n * flag=uid(get_doubt_friends_add_request 返回的 flag)→ handleDoubtFriendRequest。\n * approve 字段 NapCat 强制为 true(该接口无语义,仅保留)。\n */\n\nimport type { FriendApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setDoubtFriendsAddRequestSchema = z.object({\n flag: z.string(),\n approve: z.boolean().optional(),\n});\n\ntype SetDoubtFriendsAddRequestPayload = z.infer<typeof setDoubtFriendsAddRequestSchema>;\n\n/** 处理可疑好友申请(P2-11 接 kernel handleDoubtFriendRequest)。 */\nexport class SetDoubtFriendsAddRequestAction extends BaseAction<\n SetDoubtFriendsAddRequestPayload,\n null\n> {\n readonly name = \"set_doubt_friends_add_request\";\n readonly schema = setDoubtFriendsAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly friendApi: FriendApi;\n\n constructor(friendApi: FriendApi) {\n super();\n this.friendApi = friendApi;\n }\n\n protected _handle(payload: SetDoubtFriendsAddRequestPayload): Promise<null> {\n this.friendApi.handleDoubtFriendRequest(payload.flag);\n return Promise.resolve(null);\n }\n}\n","/**\n * set_friend_add_request 动作:处理加好友请求(P2-11)\n *\n * flag=reqTime(NapCat 约定,需从好友请求事件上报中获取)→ getBuddyReqList\n * 匹配 → handleFriendRequest(notify, approve) + optional remark。\n */\n\nimport { type FriendApi, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setFriendAddRequestSchema = z.object({\n flag: z.string(),\n approve: z.boolean().optional(),\n remark: z.string().optional(),\n});\n\ntype SetFriendAddRequestPayload = z.infer<typeof setFriendAddRequestSchema>;\n\n/** 处理加好友请求(P2-11 接 kernel FriendApi)。 */\nexport class SetFriendAddRequestAction extends BaseAction<SetFriendAddRequestPayload, null> {\n readonly name = \"set_friend_add_request\";\n readonly schema = setFriendAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly friendApi: FriendApi;\n\n constructor(friendApi: FriendApi) {\n super();\n this.friendApi = friendApi;\n }\n\n protected async _handle(payload: SetFriendAddRequestPayload): Promise<null> {\n const list = await this.friendApi.getBuddyReqList();\n const notify = list.find((req) => req.reqTime === payload.flag);\n if (notify === undefined) {\n throw kernelError(\"未找到对应的好友请求(flag 无效或已过期)\", \"NOT_FOUND\");\n }\n await this.friendApi.handleFriendRequest(notify, payload.approve !== false);\n if (payload.remark !== undefined) {\n this.friendApi.setFriendRemark(notify.friendUid, payload.remark);\n }\n return null;\n }\n}\n","/**\n * set_friend_remark 动作:设置好友备注(P2-11 接 kernel FriendApi.setFriendRemark)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst setFriendRemarkSchema = z.object({\n user_id: z.number(),\n remark: z.string(),\n});\n\ntype SetFriendRemarkPayload = z.infer<typeof setFriendRemarkSchema>;\n\n/** 设置好友备注(P2-11 接 kernel setFriendRemark)。 */\nexport class SetFriendRemarkAction extends BaseAction<SetFriendRemarkPayload, null> {\n readonly name = \"set_friend_remark\";\n readonly schema = setFriendRemarkSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"friendApi\" | \"uinToUid\">;\n\n constructor(deps: Pick<OneBotApi, \"friendApi\" | \"uinToUid\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SetFriendRemarkPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n this.deps.friendApi.setFriendRemark(uid, payload.remark);\n return null;\n }\n}\n","/**\n * MessageUnique:OneBot message_id ↔ NT msgId 双向映射(P2-3,协议相关)\n *\n * OB11 的 message_id 是 int32;NT msgId 是雪花字符串(如 \"3071303571-1234567890\")。\n * 本类提供稳定双向映射:新消息分配递增 int32,消息事件翻译与 send_msg 返回都走这里,\n * 保证同一 NT 消息在协议侧拿到一致 message_id。\n *\n * 溢出(>2^31-1)后从头分配:优先复用已 release 的槽位(先检查释放池,再线性扫描)。\n */\nimport type { Peer } from \"@napuketto/kernel\";\nimport { kernelError } from \"@napuketto/kernel\";\n\n/** OB11 message_id 上限(int32 max = 0x7FFF_FFFF)。 */\nconst INT32_MAX = 0x7f_ff_ff_ff;\n\n/** int32 下限。 */\nconst INT32_MIN = 1;\n\nexport class MessageUnique {\n /** NT msgId → OB11 message_id。 */\n private readonly msgIdToInt = new Map<string, number>();\n /** OB11 message_id → NT msgId。 */\n private readonly intToMsgId = new Map<number, string>();\n /** NT msgId → Peer(delete_msg / get_msg 等只有 message_id 时反查用)。 */\n private readonly msgIdToPeer = new Map<string, Peer>();\n /** 递增计数器。 */\n private cursor = 1;\n /** 已释放的槽位(可复用)。 */\n private readonly freed = new Set<number>();\n\n /**\n * 为新 NT 消息分配 OB11 message_id(幂等:同一 msgId 返回同一 id)。\n * peer 可选:传入则记录,供 message_id → peer 反查。\n */\n alloc(msgId: string, peer?: Peer): number {\n const existing = this.msgIdToInt.get(msgId);\n if (existing !== undefined) {\n if (peer !== undefined) {\n this.msgIdToPeer.set(msgId, peer);\n }\n return existing;\n }\n const id = this.nextFreeId();\n this.msgIdToInt.set(msgId, id);\n this.intToMsgId.set(id, msgId);\n if (peer !== undefined) {\n this.msgIdToPeer.set(msgId, peer);\n }\n this.freed.delete(id);\n return id;\n }\n\n /** OB11 message_id → NT msgId。 */\n getMsgId(messageId: number): string | undefined {\n return this.intToMsgId.get(messageId);\n }\n\n /** NT msgId → OB11 message_id(未分配返回 undefined)。 */\n getMessageId(msgId: string): number | undefined {\n return this.msgIdToInt.get(msgId);\n }\n\n /** NT msgId → Peer(alloc 时未记录返回 undefined)。 */\n getPeer(msgId: string): Peer | undefined {\n return this.msgIdToPeer.get(msgId);\n }\n\n /** 释放 NT msgId 占用的槽位(消息过期/删除时调用,可选)。 */\n release(msgId: string): void {\n const id = this.msgIdToInt.get(msgId);\n if (id === undefined) {\n return;\n }\n this.msgIdToInt.delete(msgId);\n this.intToMsgId.delete(id);\n this.msgIdToPeer.delete(msgId);\n this.freed.add(id);\n }\n\n /** 取下一个可用 id:优先释放池,否则递增(溢出后线性扫描空洞)。 */\n private nextFreeId(): number {\n for (const id of this.freed) {\n return id;\n }\n if (this.cursor > INT32_MAX) {\n // 溢出:从头找空洞(O(n),消息量级下可接受)\n for (let i = INT32_MIN; i <= INT32_MAX; i += 1) {\n if (!this.intToMsgId.has(i)) {\n this.cursor = i + 1;\n return i;\n }\n }\n throw kernelError(\"MessageUnique 槽位耗尽(>2^31 条消息)\", \"INVALID_STATE\");\n }\n const id = this.cursor;\n this.cursor += 1;\n return id;\n }\n}\n\n/**\n * 从 OB11 message_id 反查 NT msgId + Peer。\n * delete_msg / get_msg / set_msg_emoji_like / fetch_ptt_text / 精华消息等\n * 只有 message_id 参数的动作共用(消息不存在抛 KernelError NOT_FOUND)。\n */\nexport function resolveMsgIdAndPeer(\n messageId: number | string,\n unique: MessageUnique,\n): { msgId: string; peer: Peer } {\n let shortId: number;\n if (typeof messageId === \"number\") {\n shortId = messageId;\n } else {\n shortId = Number(messageId);\n }\n const msgId = unique.getMsgId(shortId);\n if (msgId === undefined) {\n throw kernelError(`消息 ${messageId} 不存在`, \"NOT_FOUND\");\n }\n const peer = unique.getPeer(msgId);\n if (peer === undefined) {\n throw kernelError(`消息 ${messageId} 无会话记录`, \"NOT_FOUND\");\n }\n return { msgId, peer };\n}\n","/**\n * set_essence_msg 动作:设置精华消息(P2-10 接 kernel GroupApi.addGroupEssence)\n *\n * message_id → msgId + peer(MessageUnique 反查,需群消息)→ addGroupEssence。\n */\n\nimport { ChatType, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setEssenceMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\n/** 精华消息依赖(OneBotApi 视图,由装配方注入)。 */\nexport type EssenceMsgDeps = Pick<OneBotApi, \"groupApi\" | \"messageUnique\">;\n\n/** 精华消息基类(set/delete 共用实现,2026-08-08 克隆合并)。 */\nexport abstract class EssenceMsgBase extends BaseAction<{ message_id: number | string }, null> {\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n protected readonly deps: EssenceMsgDeps;\n\n constructor(deps: EssenceMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: { message_id: number | string }): Promise<null> {\n const { msgId, peer } = resolveMsgIdAndPeer(payload.message_id, this.deps.messageUnique);\n if (peer.chatType !== ChatType.GROUP) {\n throw kernelError(\"精华消息仅支持群聊消息\", \"INVALID_PARAM\");\n }\n await this.operate(peer.peerUid, msgId);\n return null;\n }\n\n /** 具体精华操作(子类实现:addGroupEssence / removeGroupEssence)。 */\n protected abstract operate(groupCode: string, msgId: string): Promise<void>;\n}\n\n/** 设置精华消息(P2-10 接 kernel addGroupEssence)。 */\nexport class SetEssenceMsgAction extends EssenceMsgBase {\n readonly name = \"set_essence_msg\";\n readonly schema = setEssenceMsgSchema;\n\n protected async operate(groupCode: string, msgId: string): Promise<void> {\n await this.deps.groupApi.addGroupEssence(groupCode, msgId);\n }\n}\n","/**\n * delete_essence_msg 动作:取消精华消息(P2-10 接 kernel GroupApi.removeGroupEssence)\n */\n\nimport { z } from \"zod\";\nimport { EssenceMsgBase } from \"./set-essence-msg.js\";\n\nconst deleteEssenceMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\n/** 取消精华消息(P2-10 接 kernel removeGroupEssence)。 */\nexport class DeleteEssenceMsgAction extends EssenceMsgBase {\n readonly name = \"delete_essence_msg\";\n readonly schema = deleteEssenceMsgSchema;\n\n protected async operate(groupCode: string, msgId: string): Promise<void> {\n await this.deps.groupApi.removeGroupEssence(groupCode, msgId);\n }\n}\n","/**\n * get_essence_msg_list 动作:获取群精华消息列表(P2-15 接 kernel WebApi)\n *\n * qun.qq.com digest_list web 接口 → msg_list。msg_content 映射 text/image 段。\n */\nimport type { WebApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OB11MessageSegment } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getEssenceMsgListSchema = z.object({\n group_id: z.number(),\n});\n\ntype GetEssenceMsgListPayload = z.infer<typeof getEssenceMsgListSchema>;\n\n/** 文本段类型(msg_content.msg_type)。 */\nconst MSG_TYPE_TEXT = 1;\n/** 图片段类型(msg_content.msg_type)。 */\nconst MSG_TYPE_IMAGE = 3;\n\n/** 精华消息项 OB11 结构。 */\nexport interface EssenceMsgInfo {\n msg_seq: number;\n msg_random: number;\n sender_id: number;\n sender_nick: string;\n operator_id: number;\n operator_nick: string;\n operator_time: number;\n message_id: number;\n content: OB11MessageSegment[];\n}\n\n/** 获取群精华消息列表(P2-15 接 kernel WebApi)。 */\nexport class GetEssenceMsgListAction extends BaseAction<\n GetEssenceMsgListPayload,\n EssenceMsgInfo[]\n> {\n readonly name = \"get_essence_msg_list\";\n readonly schema = getEssenceMsgListSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly webApi: WebApi;\n\n constructor(webApi: WebApi) {\n super();\n this.webApi = webApi;\n }\n\n protected async _handle(payload: GetEssenceMsgListPayload): Promise<EssenceMsgInfo[]> {\n const list = await this.webApi.getEssenceMsgList(String(payload.group_id));\n const out: EssenceMsgInfo[] = [];\n for (const item of list) {\n const content: OB11MessageSegment[] = [];\n for (const part of item.msg_content ?? []) {\n const seg = toSegment(part);\n if (seg !== null) {\n content.push(seg);\n }\n }\n out.push({\n msg_seq: item.msg_seq,\n msg_random: item.msg_random,\n sender_id: Number(item.sender_uin),\n sender_nick: item.sender_nick,\n operator_id: Number(item.add_digest_uin),\n operator_nick: item.add_digest_nick,\n operator_time: item.add_digest_time,\n message_id: 0,\n content,\n });\n }\n return out;\n }\n}\n\n/** msg_content 项 → OB11 段(1=text 3=image,纯函数)。 */\nfunction toSegment(part: {\n msg_type?: number;\n text?: string;\n image_url?: string;\n}): OB11MessageSegment | null {\n if (part.msg_type === MSG_TYPE_TEXT) {\n return { type: \"text\", data: { text: part.text ?? \"\" } };\n }\n if (part.msg_type === MSG_TYPE_IMAGE) {\n return { type: \"image\", data: { file: part.image_url ?? \"\" } };\n }\n return null;\n}\n","/**\n * get_group_add_request / get_group_ignored_notifies 动作(P2-15 接 kernel GroupNotifyApi)\n *\n * 与 set_group_add_request 呼应:flag=seq 用于应答。\n * - get_group_add_request:未处理申请列表(getSingleScreenNotifies(false))\n * - get_group_ignored_notifies:可疑/忽略列表(getSingleScreenNotifies(true))\n */\nimport type { GroupNotify, GroupNotifyApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupAddRequestSchema = z.object({\n count: z.number().optional(),\n});\n\ntype GetGroupAddRequestPayload = z.infer<typeof getGroupAddRequestSchema>;\n\n/** 默认获取数量。 */\nconst DEFAULT_COUNT = 100;\n\n/** 群请求项 OB11 结构。 */\nexport interface GroupAddRequestItem {\n flag: string;\n group_id: number;\n group_name: string;\n user_id: number;\n user_nick: string;\n type: number;\n checked: boolean;\n postscript: string;\n}\n\n/** 获取未处理群申请(P2-15)。 */\nexport class GetGroupAddRequestAction extends BaseAction<\n GetGroupAddRequestPayload,\n GroupAddRequestItem[]\n> {\n readonly name = \"get_group_add_request\";\n readonly schema = getGroupAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupNotifyApi: GroupNotifyApi;\n\n constructor(groupNotifyApi: GroupNotifyApi) {\n super();\n this.groupNotifyApi = groupNotifyApi;\n }\n\n protected async _handle(payload: GetGroupAddRequestPayload): Promise<GroupAddRequestItem[]> {\n const list = await this.groupNotifyApi.getSingleScreenNotifies(\n false,\n payload.count ?? DEFAULT_COUNT,\n );\n return list.map(toGroupAddRequestItem);\n }\n}\n\n/** 获取被忽略群申请(P2-15)。 */\nexport class GetGroupIgnoredNotifiesAction extends BaseAction<\n GetGroupAddRequestPayload,\n GroupAddRequestItem[]\n> {\n readonly name = \"get_group_ignored_notifies\";\n readonly schema = getGroupAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupNotifyApi: GroupNotifyApi;\n\n constructor(groupNotifyApi: GroupNotifyApi) {\n super();\n this.groupNotifyApi = groupNotifyApi;\n }\n\n protected async _handle(payload: GetGroupAddRequestPayload): Promise<GroupAddRequestItem[]> {\n const list = await this.groupNotifyApi.getSingleScreenNotifies(\n true,\n payload.count ?? DEFAULT_COUNT,\n );\n return list.map(toGroupAddRequestItem);\n }\n}\n\n/** GroupNotify → OB11 群请求项(纯函数)。 */\nfunction toGroupAddRequestItem(notify: GroupNotify): GroupAddRequestItem {\n const { seq, type, status, postscript, user1, group } = notify;\n let groupCode = 0;\n let groupName = \"\";\n if (group !== undefined) {\n const { groupCode: code, groupName: name } = group;\n groupCode = Number(code);\n groupName = name;\n }\n let userId = 0;\n let userNick = \"\";\n if (user1 !== undefined) {\n const { uid, nickName } = user1;\n userId = Number(uid);\n userNick = nickName;\n }\n return {\n flag: seq,\n group_id: groupCode,\n group_name: groupName,\n user_id: userId,\n user_nick: userNick,\n type,\n checked: status !== 1,\n postscript: postscript ?? \"\",\n };\n}\n","/**\n * get_group_at_all_remain 动作:获取群 @全体成员 剩余次数(NapCat 扩展,P2-10)\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupAtAllRemainSchema = z.object({\n group_id: z.number(),\n});\n\ntype GetGroupAtAllRemainPayload = z.infer<typeof getGroupAtAllRemainSchema>;\n\n/** @全体剩余次数返回结构。 */\nexport interface AtAllRemainInfo {\n can_at_all: boolean;\n remain_at_all_count_for_uin: number;\n remain_at_all_count_for_group: number;\n}\n\n/** 获取群 @全体成员 剩余次数(P2-10 接 kernel getGroupRemainAtTimes)。 */\nexport class GetGroupAtAllRemainAction extends BaseAction<\n GetGroupAtAllRemainPayload,\n AtAllRemainInfo\n> {\n readonly name = \"get_group_at_all_remain\";\n readonly schema = getGroupAtAllRemainSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: GetGroupAtAllRemainPayload): Promise<AtAllRemainInfo> {\n const remain = await this.groupApi.getGroupRemainAtTimes(String(payload.group_id));\n return {\n can_at_all: remain.canAtAll,\n remain_at_all_count_for_uin: remain.remainAtAllCountForUin,\n remain_at_all_count_for_group: remain.remainAtAllCountForGroup,\n };\n }\n}\n","/**\n * get_group_honor_info 动作:获取群荣誉信息(P2-15 接 kernel WebApi)\n *\n * qun.qq.com honorlist web 接口;type 缺省 all。\n */\nimport type { GroupHonorWebInfo, WebApi } from \"@napuketto/kernel\";\nimport { WebHonorType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupHonorInfoSchema = z.object({\n group_id: z.number(),\n type: z.string().optional(),\n});\n\ntype GetGroupHonorInfoPayload = z.infer<typeof getGroupHonorInfoSchema>;\n\n/** 获取群荣誉信息(P2-15 接 kernel WebApi)。 */\nexport class GetGroupHonorInfoAction extends BaseAction<\n GetGroupHonorInfoPayload,\n GroupHonorWebInfo\n> {\n readonly name = \"get_group_honor_info\";\n readonly schema = getGroupHonorInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly webApi: WebApi;\n\n constructor(webApi: WebApi) {\n super();\n this.webApi = webApi;\n }\n\n protected _handle(payload: GetGroupHonorInfoPayload): Promise<GroupHonorWebInfo> {\n const type = mapHonorType(payload.type);\n return this.webApi.getGroupHonorInfo(String(payload.group_id), type);\n }\n}\n\n/** type 字符串 → WebHonorType(talkative/performer/legend/emotion/all,纯函数)。 */\nfunction mapHonorType(raw: string | undefined): WebHonorType {\n if (raw === \"talkative\") {\n return WebHonorType.TALKATIVE;\n }\n if (raw === \"performer\") {\n return WebHonorType.PERFORMER;\n }\n if (raw === \"legend\") {\n return WebHonorType.LEGEND;\n }\n if (raw === \"emotion\") {\n return WebHonorType.EMOTION;\n }\n return WebHonorType.ALL;\n}\n","/**\n * OB11 翻译辅助(NT 实体 → OB11 结构,P2-4)\n *\n * 纯函数(ADR-008):只读入参,不调 API、不读缓存。\n * 群成员/群信息等 NT 实体 → OB11 返回结构的薄映射。\n */\nimport { type Group, GroupApi, type GroupDetailInfo, type GroupMember } from \"@napuketto/kernel\";\nimport type { GroupInfo, GroupMemberInfo } from \"../types/index.js\";\n\n/** NT Group → OB11 GroupInfo。 */\nexport function toOb11GroupInfo(group: Group): GroupInfo {\n const info: GroupInfo = {\n group_id: Number(group.groupCode),\n group_name: group.groupName,\n };\n if (typeof group.memberCount === \"number\") {\n info.member_count = group.memberCount;\n }\n if (typeof group.maxMember === \"number\") {\n info.max_member_count = group.maxMember;\n }\n return info;\n}\n\n/** NT GroupDetailInfo → OB11 GroupInfo(getGroupDetailInfo / GroupCache 用)。 */\nexport function toOb11GroupInfoDetail(detail: GroupDetailInfo): GroupInfo {\n const info: GroupInfo = {\n group_id: Number(detail.groupCode),\n group_name: detail.groupName,\n };\n if (typeof detail.memberNum === \"number\") {\n info.member_count = detail.memberNum;\n }\n if (typeof detail.maxMemberNum === \"number\") {\n info.max_member_count = detail.maxMemberNum;\n }\n return info;\n}\n\n/** 禁言秒 → 毫秒(shut_up_timestamp 单位)。 */\nconst SEC_TO_MS = 1000;\n\n/** NT GroupMember → OB11 GroupMemberInfo(uin 由 uidToUin 映射补全)。 */\nexport function toOb11GroupMemberInfo(\n groupCode: string,\n member: GroupMember,\n uidToUin: Map<string, string>,\n): GroupMemberInfo {\n let uinStr = member.uin;\n if (uinStr === \"\") {\n uinStr = uidToUin.get(member.uid) ?? member.uid;\n }\n const info: GroupMemberInfo = {\n group_id: Number(groupCode),\n user_id: Number(uinStr),\n nickname: member.nick,\n role: GroupApi.roleToString(member.role),\n };\n if (member.cardName !== \"\") {\n info.card = member.cardName;\n }\n if (member.memberSpecialTitle !== undefined && member.memberSpecialTitle !== \"\") {\n info.title = member.memberSpecialTitle;\n info.special_title = member.memberSpecialTitle;\n }\n if (member.shutUpTime > 0) {\n info.shut_up_timestamp = member.shutUpTime * SEC_TO_MS;\n }\n if (member.joinTime !== \"\" && member.joinTime !== \"0\") {\n info.join_time = Number(member.joinTime);\n }\n if (member.lastSpeakTime !== \"\" && member.lastSpeakTime !== \"0\") {\n info.last_sent_time = Number(member.lastSpeakTime);\n }\n if (typeof member.age === \"number\") {\n info.age = member.age;\n }\n return info;\n}\n","/**\n * get_group_info 动作:获取群信息(P2-4 接 kernel GroupApi;P2-17 读缓存)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { toOb11GroupInfoDetail } from \"../../helper/translate.js\";\nimport type { GroupInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupInfoSchema = z.object({\n group_id: z.number(),\n /** 是否忽略缓存(go-cqhttp 扩展)。 */\n no_cache: z.boolean().optional(),\n});\n\ntype GetGroupInfoPayload = z.infer<typeof getGroupInfoSchema>;\n\n/** 获取群信息(P2-4 接 kernel apis/group;P2-17 优先读 GroupCache)。 */\nexport class GetGroupInfoAction extends BaseAction<GetGroupInfoPayload, GroupInfo> {\n readonly name = \"get_group_info\";\n readonly schema = getGroupInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">;\n\n constructor(deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupInfoPayload): Promise<GroupInfo> {\n const groupCode = String(payload.group_id);\n if (payload.no_cache !== true && this.deps.groupCache !== undefined) {\n const detail = await this.deps.groupCache.getGroupDetail(groupCode);\n return toOb11GroupInfoDetail(detail);\n }\n const detail = await this.deps.groupApi.getGroupInfo(groupCode);\n return toOb11GroupInfoDetail(detail);\n }\n}\n","/**\n * get_group_list 动作:获取群列表(P2-4 接 kernel GroupApi + GroupCache)\n *\n * ⚠️ 实测校准(2026-08-08 端到端联调):原生 getGroupList 返回值无数据\n * (仅 { result, errMsg }),列表经 onGroupListUpdate 事件推送 → GroupCache\n * 维护——列表一律从缓存读,no_cache=true 仅触发原生刷新。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { toOb11GroupInfo } from \"../../helper/translate.js\";\nimport type { GroupInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupListSchema = z.object({\n /** 是否忽略缓存(go-cqhttp 扩展)。 */\n no_cache: z.boolean().optional(),\n});\n\ntype GetGroupListPayload = z.infer<typeof getGroupListSchema>;\n\n/** 获取群列表(P2-4 接 kernel apis/group;群列表数据经事件推送,从 GroupCache 读)。 */\nexport class GetGroupListAction extends BaseAction<GetGroupListPayload, GroupInfo[]> {\n readonly name = \"get_group_list\";\n readonly schema = getGroupListSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">;\n\n constructor(deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupListPayload): Promise<GroupInfo[]> {\n // 实测校准(2026-08-08):原生 getGroupList 返回值无数据,列表经\n // onGroupListUpdate 事件推送 → GroupCache 维护;缓存为空时\n // listGroupsRefreshed 主动触发刷新并等待回填。\n // no_cache=true 兼容:始终触发刷新(语义等价缓存必空场景)。\n const groups =\n this.deps.groupCache === undefined\n ? await this.deps.groupApi.getGroupList(true)\n : payload.no_cache === true\n ? await this.deps.groupCache.listGroupsRefreshed()\n : this.deps.groupCache.listGroups();\n return groups.map(toOb11GroupInfo);\n }\n}\n","/**\n * get_group_member_info 动作:获取群成员信息(P2-4 接 kernel GroupApi;P2-17 读缓存)\n */\n\nimport { type GroupMember, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { toOb11GroupMemberInfo } from \"../../helper/translate.js\";\nimport type { GroupMemberInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupMemberInfoSchema = z.object({\n group_id: z.number(),\n user_id: z.number(),\n /** 是否忽略缓存(go-cqhttp 扩展)。 */\n no_cache: z.boolean().optional(),\n});\n\ntype GetGroupMemberInfoPayload = z.infer<typeof getGroupMemberInfoSchema>;\n\n/** 获取群成员信息(P2-4 接 kernel apis/group;P2-17 优先读 GroupCache)。 */\nexport class GetGroupMemberInfoAction extends BaseAction<\n GetGroupMemberInfoPayload,\n GroupMemberInfo\n> {\n readonly name = \"get_group_member_info\";\n readonly schema = getGroupMemberInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">;\n\n constructor(deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupMemberInfoPayload): Promise<GroupMemberInfo> {\n const groupCode = String(payload.group_id);\n // user_id 是 uin:先 uin→uid,再查成员\n const uidMap = await this.deps.groupApi.uinToUid([String(payload.user_id)]);\n const uid = uidMap.get(String(payload.user_id));\n if (uid === undefined) {\n throw kernelError(`成员 ${payload.user_id} 不在群 ${payload.group_id}`, \"NOT_FOUND\");\n }\n const member = await this.resolveMember(groupCode, uid, payload.no_cache === true);\n if (member === undefined) {\n throw kernelError(`成员 ${payload.user_id} 不在群 ${payload.group_id}`, \"NOT_FOUND\");\n }\n const uinMap = await this.deps.groupApi.uidToUin([uid]);\n return toOb11GroupMemberInfo(groupCode, member, uinMap);\n }\n\n /** 读缓存(缺省)或直查 api(no_cache=true / 未装配缓存)。 */\n private async resolveMember(\n groupCode: string,\n uid: string,\n noCache: boolean,\n ): Promise<GroupMember | undefined> {\n if (noCache || this.deps.groupCache === undefined) {\n const members = await this.deps.groupApi.getGroupMemberInfo(groupCode, [uid]);\n const [member] = members;\n return member;\n }\n return await this.deps.groupCache.getMember(groupCode, uid);\n }\n}\n","/**\n * get_group_member_list 动作:获取群成员列表(P2-4 接 kernel GroupApi;P2-17 读缓存)\n */\n\nimport type { GroupMember } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { toOb11GroupMemberInfo } from \"../../helper/translate.js\";\nimport type { GroupMemberInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupMemberListSchema = z.object({\n group_id: z.number(),\n /** 是否忽略缓存(go-cqhttp 扩展)。 */\n no_cache: z.boolean().optional(),\n});\n\ntype GetGroupMemberListPayload = z.infer<typeof getGroupMemberListSchema>;\n\n/** 获取群成员列表(P2-4 接 kernel apis/group;P2-17 优先读 GroupCache)。 */\nexport class GetGroupMemberListAction extends BaseAction<\n GetGroupMemberListPayload,\n GroupMemberInfo[]\n> {\n readonly name = \"get_group_member_list\";\n readonly schema = getGroupMemberListSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">;\n\n constructor(deps: Pick<OneBotApi, \"groupApi\" | \"groupCache\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupMemberListPayload): Promise<GroupMemberInfo[]> {\n const groupCode = String(payload.group_id);\n const noCache = payload.no_cache === true;\n let members: GroupMember[];\n if (noCache || this.deps.groupCache === undefined) {\n members = await this.deps.groupApi.getGroupMemberList(groupCode, noCache);\n } else {\n members = await this.deps.groupCache.getMembers(groupCode);\n }\n const uinMap = await this.deps.groupApi.uidToUin(members.map((m) => m.uid));\n return members.map((m) => toOb11GroupMemberInfo(groupCode, m, uinMap));\n }\n}\n","/**\n * get_group_shut_list 动作:获取群禁言列表(P2-13 接 kernel GroupNotifyApi)\n *\n * getGroupShutUpMemberList → [{ user_id, nickname, shut_up_time }](uin 经 uidToUin)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupShutListSchema = z.object({\n group_id: z.number(),\n});\n\ntype GetGroupShutListPayload = z.infer<typeof getGroupShutListSchema>;\n\n/** 禁言成员 OB11 结构。 */\nexport interface ShutListMember {\n user_id: number;\n nickname: string;\n shut_up_time: number;\n}\n\n/** 获取群禁言列表(P2-13 接 kernel GroupNotifyApi)。 */\nexport class GetGroupShutListAction extends BaseAction<GetGroupShutListPayload, ShutListMember[]> {\n readonly name = \"get_group_shut_list\";\n readonly schema = getGroupShutListSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupNotifyApi\" | \"uidToUin\">;\n\n constructor(deps: Pick<OneBotApi, \"groupNotifyApi\" | \"uidToUin\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupShutListPayload): Promise<ShutListMember[]> {\n const members = await this.deps.groupNotifyApi.getGroupShutUpMemberList(\n String(payload.group_id),\n );\n const uids = members.map((m) => m.uid);\n let uinMap = new Map<string, string>();\n if (uids.length > 0) {\n uinMap = await this.deps.uidToUin(uids);\n }\n const out: ShutListMember[] = [];\n for (const member of members) {\n out.push({\n user_id: Number(uinMap.get(member.uid) ?? member.uin ?? member.uid),\n nickname: member.nick,\n shut_up_time: member.shutUpTime,\n });\n }\n return out;\n }\n}\n","/**\n * get_group_system_msg 动作:获取群系统消息(P2-13 接 kernel GroupNotifyApi)\n *\n * getSingleScreenNotifies(false, count) → type 1=进群邀请 / 7=入群申请。\n * 返回 OB11 结构:invited_requests / InvitedRequest(兼容别名)/ join_requests。\n */\n\nimport type { GroupNotify } from \"@napuketto/kernel\";\nimport { GroupNotifyMsgType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupSystemMsgSchema = z.object({\n count: z.number().optional(),\n});\n\ntype GetGroupSystemMsgPayload = z.infer<typeof getGroupSystemMsgSchema>;\n\n/** 默认获取数量。 */\nconst DEFAULT_COUNT = 50;\n\n/** 群系统消息返回结构。 */\nexport interface GroupSystemMessageInfo {\n request_id: number;\n invitor_uin: number;\n invitor_nick: string;\n group_id: number;\n message: string;\n group_name: string;\n checked: boolean;\n actor: number;\n requester_nick: string;\n}\n\n/** 群系统消息返回。 */\nexport interface GroupSystemMsgResult {\n invited_requests: GroupSystemMessageInfo[];\n InvitedRequest: GroupSystemMessageInfo[];\n join_requests: GroupSystemMessageInfo[];\n}\n\n/** 获取群系统消息(P2-13 接 kernel GroupNotifyApi)。 */\nexport class GetGroupSystemMsgAction extends BaseAction<\n GetGroupSystemMsgPayload,\n GroupSystemMsgResult\n> {\n readonly name = \"get_group_system_msg\";\n readonly schema = getGroupSystemMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"groupNotifyApi\" | \"uidToUin\">;\n\n constructor(deps: Pick<OneBotApi, \"groupNotifyApi\" | \"uidToUin\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetGroupSystemMsgPayload): Promise<GroupSystemMsgResult> {\n const count = payload.count ?? DEFAULT_COUNT;\n const notifies = await this.deps.groupNotifyApi.getSingleScreenNotifies(false, count);\n const uinMap = await this.collectUinMap(notifies);\n const invited: GroupSystemMessageInfo[] = [];\n const joined: GroupSystemMessageInfo[] = [];\n for (const notify of notifies) {\n const info = toMessageInfo(notify, uinMap);\n if (notify.type === GroupNotifyMsgType.INVITED_BY_MEMBER) {\n invited.push(info);\n } else if (notify.type === GroupNotifyMsgType.REQUEST_JOIN_NEED_ADMINI_STRATOR_PASS) {\n joined.push(info);\n }\n }\n const result = {\n invited_requests: invited,\n join_requests: joined,\n } as GroupSystemMsgResult;\n // 兼容别名 InvitedRequest(对象字面量 PascalCase 键被 useNamingConvention 拦截,改用索引)\n result[\"InvitedRequest\"] = invited;\n return result;\n }\n\n /** 收集全部涉及的 uid 批量转 uin(循环外一次请求)。 */\n private async collectUinMap(notifies: GroupNotify[]): Promise<Map<string, string>> {\n const uids: string[] = [];\n for (const notify of notifies) {\n const { user1, user2 } = notify;\n if (user1 !== undefined) {\n const { uid } = user1;\n if (uid !== \"\") {\n uids.push(uid);\n }\n }\n if (user2 !== undefined) {\n const { uid } = user2;\n if (uid !== \"\") {\n uids.push(uid);\n }\n }\n }\n if (uids.length === 0) {\n return new Map();\n }\n return await this.deps.uidToUin(uids);\n }\n}\n\n/** GroupNotify → OB11 群系统消息结构(纯函数,uin 已批量转换)。 */\nfunction toMessageInfo(notify: GroupNotify, uinMap: Map<string, string>): GroupSystemMessageInfo {\n const { seq, status, postscript, user1, user2, group } = notify;\n let user1Uid = \"\";\n if (user1 !== undefined) {\n const { uid } = user1;\n user1Uid = uid;\n }\n let user2Uid = \"\";\n if (user2 !== undefined) {\n const { uid } = user2;\n user2Uid = uid;\n }\n let groupCode = 0;\n let groupName = \"\";\n if (group !== undefined) {\n const { groupCode: code, groupName: name } = group;\n groupCode = Number(code);\n groupName = name;\n }\n let invitorUin = Number(user1Uid);\n const mapped1 = uinMap.get(user1Uid);\n if (mapped1 !== undefined) {\n invitorUin = Number(mapped1);\n }\n let actor = Number(user2Uid);\n const mapped2 = uinMap.get(user2Uid);\n if (mapped2 !== undefined) {\n actor = Number(mapped2);\n }\n let invitorNick = \"\";\n if (user1 !== undefined) {\n const { nickName } = user1;\n invitorNick = nickName;\n }\n return {\n request_id: Number(seq),\n invitor_uin: invitorUin,\n invitor_nick: invitorNick,\n group_id: groupCode,\n message: postscript ?? \"\",\n group_name: groupName,\n checked: status !== 1,\n actor,\n requester_nick: invitorNick,\n };\n}\n","/**\n * 群文件操作动作(P2-14):create_group_file_folder / delete_group_file /\n * delete_group_folder / rename_group_file / move_group_file / trans_group_file\n */\nimport type { RichMediaApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst createGroupFileFolderSchema = z.object({\n group_id: z.number(),\n folder_name: z.string(),\n});\n\ntype CreateGroupFileFolderPayload = z.infer<typeof createGroupFileFolderSchema>;\n\n/** 创建群文件夹(P2-14)。 */\nexport class CreateGroupFileFolderAction extends BaseAction<\n CreateGroupFileFolderPayload,\n { folder_id: string }\n> {\n readonly name = \"create_group_file_folder\";\n readonly schema = createGroupFileFolderSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: CreateGroupFileFolderPayload): Promise<{ folder_id: string }> {\n const folderId = await this.richMediaApi.createGroupFolder(\n String(payload.group_id),\n payload.folder_name,\n );\n return { folder_id: folderId };\n }\n}\n\nconst deleteGroupFileSchema = z.object({\n group_id: z.number(),\n file_id: z.string(),\n /** 兼容 go-cqhttp 的 file_ids 数组(取第一个)。 */\n file_ids: z.array(z.string()).optional(),\n});\n\ntype DeleteGroupFilePayload = z.infer<typeof deleteGroupFileSchema>;\n\n/** 删除群文件(P2-14)。 */\nexport class DeleteGroupFileAction extends BaseAction<DeleteGroupFilePayload, null> {\n readonly name = \"delete_group_file\";\n readonly schema = deleteGroupFileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: DeleteGroupFilePayload): Promise<null> {\n const ids = payload.file_ids ?? [payload.file_id];\n await this.richMediaApi.deleteGroupFile(String(payload.group_id), ids);\n return null;\n }\n}\n\nconst deleteGroupFolderSchema = z.object({\n group_id: z.number(),\n folder_id: z.string(),\n});\n\ntype DeleteGroupFolderPayload = z.infer<typeof deleteGroupFolderSchema>;\n\n/** 删除群文件夹(P2-14)。 */\nexport class DeleteGroupFolderAction extends BaseAction<DeleteGroupFolderPayload, null> {\n readonly name = \"delete_group_folder\";\n readonly schema = deleteGroupFolderSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: DeleteGroupFolderPayload): Promise<null> {\n await this.richMediaApi.deleteGroupFolder(String(payload.group_id), payload.folder_id);\n return null;\n }\n}\n\nconst renameGroupFileSchema = z.object({\n group_id: z.number(),\n file_id: z.string(),\n new_name: z.string(),\n});\n\ntype RenameGroupFilePayload = z.infer<typeof renameGroupFileSchema>;\n\n/** 重命名群文件(P2-14)。 */\nexport class RenameGroupFileAction extends BaseAction<RenameGroupFilePayload, null> {\n readonly name = \"rename_group_file\";\n readonly schema = renameGroupFileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: RenameGroupFilePayload): Promise<null> {\n await this.richMediaApi.renameGroupFile(\n String(payload.group_id),\n payload.file_id,\n payload.new_name,\n );\n return null;\n }\n}\n\nconst moveGroupFileSchema = z.object({\n group_id: z.number(),\n file_id: z.string(),\n file_ids: z.array(z.string()).optional(),\n /** 目标文件夹 ID(空为根目录)。 */\n folder_id: z.string().optional(),\n});\n\ntype MoveGroupFilePayload = z.infer<typeof moveGroupFileSchema>;\n\n/** 移动群文件(P2-14)。 */\nexport class MoveGroupFileAction extends BaseAction<MoveGroupFilePayload, null> {\n readonly name = \"move_group_file\";\n readonly schema = moveGroupFileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: MoveGroupFilePayload): Promise<null> {\n const ids = payload.file_ids ?? [payload.file_id];\n await this.richMediaApi.moveGroupFile(\n String(payload.group_id),\n ids,\n payload.folder_id ?? \"\",\n );\n return null;\n }\n}\n\nconst transGroupFileSchema = z.object({\n group_id: z.number(),\n file_id: z.string(),\n});\n\ntype TransGroupFilePayload = z.infer<typeof transGroupFileSchema>;\n\n/** 转存群文件(P2-14)。 */\nexport class TransGroupFileAction extends BaseAction<TransGroupFilePayload, null> {\n readonly name = \"trans_group_file\";\n readonly schema = transGroupFileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: TransGroupFilePayload): Promise<null> {\n await this.richMediaApi.transGroupFile(String(payload.group_id), payload.file_id);\n return null;\n }\n}\n","/**\n * 群文件查询动作(P2-14):get_group_root_files / get_group_files_by_folder /\n * get_group_file_system_info\n */\nimport type {\n GroupFileItemInfo,\n GroupFolderInfo as KernelFolderInfo,\n RichMediaApi,\n} from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getGroupRootFilesSchema = z.object({\n group_id: z.number(),\n file_count: z.number().optional(),\n});\n\ntype GetGroupRootFilesPayload = z.infer<typeof getGroupRootFilesSchema>;\n\n/** 默认文件数量。 */\nconst DEFAULT_FILE_COUNT = 50;\n\n/** 文件条目 OB11 结构。 */\nexport interface GroupFileInfo {\n file_id: string;\n file_name: string;\n file_size: string;\n uploader?: number;\n upload_time?: number;\n modify_time?: number;\n}\n\n/** 文件夹条目 OB11 结构。 */\nexport interface GroupFolderInfo {\n folder_id: string;\n folder_name: string;\n}\n\n/** 群文件列表返回。 */\nexport interface GroupFilesResult {\n files: GroupFileInfo[];\n folders: GroupFolderInfo[];\n}\n\n/** 获取群根目录文件列表(P2-14 接 kernel RichMediaApi)。 */\nexport class GetGroupRootFilesAction extends BaseAction<\n GetGroupRootFilesPayload,\n GroupFilesResult\n> {\n readonly name = \"get_group_root_files\";\n readonly schema = getGroupRootFilesSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: GetGroupRootFilesPayload): Promise<GroupFilesResult> {\n const list = await this.richMediaApi.getGroupFileList(\n String(payload.group_id),\n \"\",\n payload.file_count ?? DEFAULT_FILE_COUNT,\n );\n return splitFilesAndFolders(list);\n }\n}\n\nconst getGroupFilesByFolderSchema = z.object({\n group_id: z.number(),\n folder_id: z.string(),\n file_count: z.number().optional(),\n});\n\ntype GetGroupFilesByFolderPayload = z.infer<typeof getGroupFilesByFolderSchema>;\n\n/** 获取群指定文件夹文件列表(P2-14)。 */\nexport class GetGroupFilesByFolderAction extends BaseAction<\n GetGroupFilesByFolderPayload,\n GroupFilesResult\n> {\n readonly name = \"get_group_files_by_folder\";\n readonly schema = getGroupFilesByFolderSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: GetGroupFilesByFolderPayload): Promise<GroupFilesResult> {\n const list = await this.richMediaApi.getGroupFileList(\n String(payload.group_id),\n payload.folder_id,\n payload.file_count ?? DEFAULT_FILE_COUNT,\n );\n return splitFilesAndFolders(list);\n }\n}\n\nconst getGroupFileSystemInfoSchema = z.object({\n group_id: z.number(),\n});\n\ntype GetGroupFileSystemInfoPayload = z.infer<typeof getGroupFileSystemInfoSchema>;\n\n/** 群文件系统信息(P2-14)。 */\nexport class GetGroupFileSystemInfoAction extends BaseAction<\n GetGroupFileSystemInfoPayload,\n { file_count: number; limit_count: number; used_space: number; total_space: number }\n> {\n readonly name = \"get_group_file_system_info\";\n readonly schema = getGroupFileSystemInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: GetGroupFileSystemInfoPayload): Promise<{\n file_count: number;\n limit_count: number;\n used_space: number;\n total_space: number;\n }> {\n const info = await this.richMediaApi.getGroupFileSystemInfo(String(payload.group_id));\n return {\n file_count: info.fileCount,\n limit_count: info.limitCount,\n used_space: info.usedSpace,\n total_space: info.totalSpace,\n };\n }\n}\n\n/** 列表拆分 files/folders(fileInfo/folderInfo 取其一,纯函数)。 */\nfunction splitFilesAndFolders(\n list: Array<{ fileInfo?: GroupFileItemInfo; folderInfo?: KernelFolderInfo }>,\n): GroupFilesResult {\n const files: GroupFileInfo[] = [];\n const folders: GroupFolderInfo[] = [];\n for (const item of list) {\n const file = item.fileInfo;\n if (file === undefined) {\n const folder = item.folderInfo;\n if (folder !== undefined) {\n folders.push(toGroupFolderInfo(folder));\n }\n } else {\n const out = toGroupFileInfo(file);\n files.push(out);\n }\n }\n return { files, folders };\n}\n\n/** GroupFileItemInfo → OB11 文件结构(纯函数)。 */\nfunction toGroupFileInfo(file: GroupFileItemInfo): GroupFileInfo {\n const out: GroupFileInfo = {\n file_id: file.fileId,\n file_name: file.fileName,\n file_size: file.fileSize,\n };\n if (file.uploaderUin !== undefined) {\n out.uploader = Number(file.uploaderUin);\n }\n if (file.uploadTime !== undefined) {\n out.upload_time = file.uploadTime;\n }\n if (file.modifyTime !== undefined) {\n out.modify_time = file.modifyTime;\n }\n return out;\n}\n\n/** KernelFolderInfo → OB11 文件夹结构(纯函数)。 */\nfunction toGroupFolderInfo(folder: KernelFolderInfo): GroupFolderInfo {\n return {\n folder_id: folder.folderId,\n folder_name: folder.folderName,\n };\n}\n","/**\n * set_group_add_request 动作:处理加群请求(P2-13 接 kernel GroupNotifyApi)\n *\n * flag=seq(群请求事件上报的 flag)→ getSingleScreenNotifies(doubt, count)\n * 匹配 → handleGroupRequest(approve=true→同意 / false→拒绝,reason 默认空格)。\n */\n\nimport {\n type GroupNotify,\n type GroupNotifyApi,\n kernelError,\n NTGroupRequestOperateTypes,\n} from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setGroupAddRequestSchema = z.object({\n flag: z.string(),\n approve: z.boolean().optional(),\n reason: z.string().optional(),\n count: z.number().optional(),\n});\n\ntype SetGroupAddRequestPayload = z.infer<typeof setGroupAddRequestSchema>;\n\n/** 默认搜索通知数量。 */\nconst DEFAULT_COUNT = 100;\n\n/** 处理加群请求(P2-13 接 kernel GroupNotifyApi)。 */\nexport class SetGroupAddRequestAction extends BaseAction<SetGroupAddRequestPayload, null> {\n readonly name = \"set_group_add_request\";\n readonly schema = setGroupAddRequestSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupNotifyApi: GroupNotifyApi;\n\n constructor(groupNotifyApi: GroupNotifyApi) {\n super();\n this.groupNotifyApi = groupNotifyApi;\n }\n\n protected async _handle(payload: SetGroupAddRequestPayload): Promise<null> {\n const count = payload.count ?? DEFAULT_COUNT;\n const notify = await this.findNotify(payload.flag, count);\n if (notify === null) {\n throw kernelError(\"未找到对应的群请求(flag 无效或已过期)\", \"NOT_FOUND\");\n }\n let operateType: NTGroupRequestOperateTypes = NTGroupRequestOperateTypes.KREFUSE;\n if (payload.approve !== false) {\n operateType = NTGroupRequestOperateTypes.KAGREE;\n }\n await this.groupNotifyApi.handleGroupRequest(\n false,\n notify,\n operateType,\n payload.reason ?? \" \",\n );\n return null;\n }\n\n /** 按 seq 匹配通知(先非可疑,后可疑)。 */\n private async findNotify(flag: string, count: number): Promise<GroupNotify | null> {\n const normal = await this.groupNotifyApi.getSingleScreenNotifies(false, count);\n const hit = normal.find((item) => item.seq === flag);\n if (hit !== undefined) {\n return hit;\n }\n const doubt = await this.groupNotifyApi.getSingleScreenNotifies(true, count);\n return doubt.find((item) => item.seq === flag) ?? null;\n }\n}\n","/**\n * set_group_admin 动作:设置群管理员(P2-10 接 kernel GroupApi.setMemberRole)\n *\n * enable=true 设为管理员,false 取消;user_id → uinToUid。\n */\n\nimport { type GroupApi, NTGroupMemberRole } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst setGroupAdminSchema = z.object({\n group_id: z.number(),\n user_id: z.number(),\n /** 是否设为管理员。 */\n enable: z.boolean().default(true),\n});\n\ntype SetGroupAdminPayload = z.infer<typeof setGroupAdminSchema>;\n\n/** 设置群管理员(P2-10 接 kernel setMemberRole)。 */\nexport class SetGroupAdminAction extends BaseAction<SetGroupAdminPayload, null> {\n readonly name = \"set_group_admin\";\n readonly schema = setGroupAdminSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupAdminPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), (uins) =>\n this.groupApi.uinToUid(uins),\n );\n let role: NTGroupMemberRole = NTGroupMemberRole.MEMBER;\n if (payload.enable) {\n role = NTGroupMemberRole.ADMIN;\n }\n this.groupApi.setMemberRole(String(payload.group_id), uid, role);\n return null;\n }\n}\n","/**\n * set_group_ban 动作:群组单人禁言(P2-10 接 kernel GroupApi.setMemberShutUp)\n *\n * duration 秒(0 解除禁言);user_id → uinToUid。\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\n/** 默认禁言时长(秒)。 */\nconst DEFAULT_BAN_DURATION = 30;\n\nconst setGroupBanSchema = z.object({\n group_id: z.number(),\n user_id: z.number(),\n /** 禁言时长(秒),0 解除。 */\n duration: z.number().default(DEFAULT_BAN_DURATION),\n});\n\ntype SetGroupBanPayload = z.infer<typeof setGroupBanSchema>;\n\n/** 群组单人禁言(P2-10 接 kernel setMemberShutUp)。 */\nexport class SetGroupBanAction extends BaseAction<SetGroupBanPayload, null> {\n readonly name = \"set_group_ban\";\n readonly schema = setGroupBanSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupBanPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), (uins) =>\n this.groupApi.uinToUid(uins),\n );\n await this.groupApi.setMemberShutUp(String(payload.group_id), [\n { uid, duration: payload.duration },\n ]);\n return null;\n }\n}\n","/**\n * set_group_card 动作:设置群名片(P2-10 接 kernel GroupApi.setMemberCardName)\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst setGroupCardSchema = z.object({\n group_id: z.number(),\n user_id: z.number(),\n /** 群名片(空串清除)。 */\n card: z.string().optional().default(\"\"),\n});\n\ntype SetGroupCardPayload = z.infer<typeof setGroupCardSchema>;\n\n/** 设置群名片(P2-10 接 kernel setMemberCardName)。 */\nexport class SetGroupCardAction extends BaseAction<SetGroupCardPayload, null> {\n readonly name = \"set_group_card\";\n readonly schema = setGroupCardSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupCardPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), (uins) =>\n this.groupApi.uinToUid(uins),\n );\n this.groupApi.setMemberCardName(String(payload.group_id), uid, payload.card);\n return null;\n }\n}\n","/**\n * set_group_kick 动作:群组踢人(P2-10 接 kernel GroupApi.kickMember)\n *\n * user_id(uin)→ uinToUid → kickMember(kickMemberV2)。\n */\n\nimport { type GroupApi, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setGroupKickSchema = z.object({\n group_id: z.number(),\n user_id: z.number(),\n /** 是否拒绝加群请求(拉黑)。 */\n reject_add_request: z.boolean().optional(),\n /** 踢人理由。 */\n kick_reason: z.string().optional(),\n});\n\ntype SetGroupKickPayload = z.infer<typeof setGroupKickSchema>;\n\n/** 群组踢人(P2-10 接 kernel kickMember)。 */\nexport class SetGroupKickAction extends BaseAction<SetGroupKickPayload, null> {\n readonly name = \"set_group_kick\";\n readonly schema = setGroupKickSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupKickPayload): Promise<null> {\n const uid = await this.resolveUid(payload.user_id);\n await this.groupApi.kickMember(\n String(payload.group_id),\n [uid],\n payload.reject_add_request === true,\n payload.kick_reason ?? \"\",\n );\n return null;\n }\n\n /** user_id(uin)→ uid。 */\n private async resolveUid(userId: number): Promise<string> {\n const uidMap = await this.groupApi.uinToUid([String(userId)]);\n const uid = uidMap.get(String(userId));\n if (uid === undefined) {\n throw kernelError(`用户 ${userId} 的 uid 解析失败`, \"INVALID_PARAM\");\n }\n return uid;\n }\n}\n","/**\n * set_group_leave 动作:退出群聊(P2-10 接 kernel GroupApi.quitGroup)\n *\n * is_dismiss=true 解散群(仅群主)。\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setGroupLeaveSchema = z.object({\n group_id: z.number(),\n /** 是否解散群(仅群主可用)。 */\n is_dismiss: z.boolean().optional().default(false),\n});\n\ntype SetGroupLeavePayload = z.infer<typeof setGroupLeaveSchema>;\n\n/** 退出群聊(P2-10 接 kernel quitGroup)。 */\nexport class SetGroupLeaveAction extends BaseAction<SetGroupLeavePayload, null> {\n readonly name = \"set_group_leave\";\n readonly schema = setGroupLeaveSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupLeavePayload): Promise<null> {\n await this.groupApi.quitGroup(String(payload.group_id), payload.is_dismiss);\n return null;\n }\n}\n","/**\n * set_group_name 动作:修改群名(P2-10 接 kernel GroupApi.modifyGroupName)\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setGroupNameSchema = z.object({\n group_id: z.number(),\n group_name: z.string(),\n});\n\ntype SetGroupNamePayload = z.infer<typeof setGroupNameSchema>;\n\n/** 修改群名(P2-10 接 kernel modifyGroupName)。 */\nexport class SetGroupNameAction extends BaseAction<SetGroupNamePayload, null> {\n readonly name = \"set_group_name\";\n readonly schema = setGroupNameSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupNamePayload): Promise<null> {\n await this.groupApi.modifyGroupName(String(payload.group_id), payload.group_name);\n return null;\n }\n}\n","/**\n * set_group_whole_ban 动作:群组全员禁言(P2-10 接 kernel GroupApi.setGroupShutUp)\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setGroupWholeBanSchema = z.object({\n group_id: z.number(),\n /** 是否开启全员禁言。 */\n enable: z.boolean().default(true),\n});\n\ntype SetGroupWholeBanPayload = z.infer<typeof setGroupWholeBanSchema>;\n\n/** 群组全员禁言(P2-10 接 kernel setGroupShutUp)。 */\nexport class SetGroupWholeBanAction extends BaseAction<SetGroupWholeBanPayload, null> {\n readonly name = \"set_group_whole_ban\";\n readonly schema = setGroupWholeBanSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: SetGroupWholeBanPayload): Promise<null> {\n await this.groupApi.setGroupShutUp(String(payload.group_id), payload.enable);\n return null;\n }\n}\n","/**\n * delete_msg 动作:撤回消息(P2-10 接 kernel MsgApi.recallMessage)\n *\n * OB11 标准 delete_msg 只有 message_id;peer 经 MessageUnique 反查。\n * 群聊管理员 / 私聊 2 分钟内可撤回。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst deleteMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\ntype DeleteMsgPayload = z.infer<typeof deleteMsgSchema>;\n\n/** 撤回消息依赖(OneBotApi 视图,由装配方注入)。 */\nexport type DeleteMsgDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\">;\n\n/** 撤回消息(P2-10 接 kernel recallMessage)。 */\nexport class DeleteMsgAction extends BaseAction<DeleteMsgPayload, null> {\n readonly name = \"delete_msg\";\n readonly schema = deleteMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: DeleteMsgDeps;\n\n constructor(deps: DeleteMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: DeleteMsgPayload): Promise<null> {\n const { msgId, peer } = resolveMsgIdAndPeer(payload.message_id, this.deps.messageUnique);\n await this.deps.msgApi.recallMessage(peer, [msgId]);\n return null;\n }\n}\n","/**\n * fetch_ptt_text 动作:获取语音转文字结果(NapCat 扩展,P2-10)\n *\n * message_id → msgId + peer → MsgApi.fetchPttText(内部:拉消息 → 找 PTT 元素\n * → translatePtt2Text → 再拉取读 pttElement.text)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst fetchPttTextSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\ntype FetchPttTextPayload = z.infer<typeof fetchPttTextSchema>;\n\n/** 语音转文字依赖(OneBotApi 视图,由装配方注入)。 */\nexport type FetchPttTextDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\">;\n\n/** 获取语音转文字结果(P2-10 接 kernel fetchPttText)。 */\nexport class FetchPttTextAction extends BaseAction<FetchPttTextPayload, { text: string }> {\n readonly name = \"fetch_ptt_text\";\n readonly schema = fetchPttTextSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: FetchPttTextDeps;\n\n constructor(deps: FetchPttTextDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: FetchPttTextPayload): Promise<{ text: string }> {\n const { msgId, peer } = resolveMsgIdAndPeer(payload.message_id, this.deps.messageUnique);\n const text = await this.deps.msgApi.fetchPttText(msgId, peer);\n return { text };\n }\n}\n","/**\n * OB11 目标 Peer 解析 / 单条消息拉取(多个动作共用,2026-08-08 克隆合并)\n *\n * group_id 直通(群消息 peerUid = 群号);user_id 经 uin→uid 解析。\n */\n\nimport { ChatType, kernelError, type Peer, type RawMessage } from \"@napuketto/kernel\";\nimport type { MessageUnique } from \"../../helper/message-unique.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\n\n/** 解析目标 Peer(group_id 直通;user_id 经 uin→uid)。 */\nexport async function resolveTargetPeer(\n payload: { group_id?: number | undefined; user_id?: number | undefined },\n deps: { uinToUid: (uins: string[]) => Promise<Map<string, string>> },\n missingHint: string,\n): Promise<Peer> {\n if (payload.group_id !== undefined) {\n return { chatType: ChatType.GROUP, peerUid: String(payload.group_id) };\n }\n if (payload.user_id !== undefined) {\n const uidMap = await deps.uinToUid([String(payload.user_id)]);\n const uid = uidMap.get(String(payload.user_id));\n if (uid === undefined) {\n throw kernelError(`用户 ${payload.user_id} 的 uid 解析失败`, \"INVALID_PARAM\");\n }\n return { chatType: ChatType.C2C, peerUid: uid };\n }\n throw kernelError(missingHint, \"INVALID_PARAM\");\n}\n\n/**\n * 按 message_id(OB11 int32 或 NT msgId)拉取单条消息。\n * 消息不存在/已被撤回 → 抛 KernelError NOT_FOUND。\n */\nexport async function fetchMsgById(\n messageId: number | string,\n messageUnique: MessageUnique,\n msgApi: { fetchMsgsByMsgId: (peer: Peer, msgIds: string[]) => Promise<RawMessage[]> },\n): Promise<{ msg: RawMessage; peer: Peer; msgId: string }> {\n const { msgId, peer } = resolveMsgIdAndPeer(messageId, messageUnique);\n const msgs = await msgApi.fetchMsgsByMsgId(peer, [msgId]);\n const [msg] = msgs;\n if (msg === undefined) {\n throw kernelError(`消息 ${messageId} 不存在或已被撤回`, \"NOT_FOUND\");\n }\n return { msg, peer, msgId };\n}\n","/**\n * forward_group_single_msg / forward_friend_single_msg 动作:单条转发(P2-12)\n *\n * message_id 反查源 msgId + peer;group_id/user_id 为目标 →\n * MsgApi.forwardSingleMessage(srcPeer, [msgId], dstPeer)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveTargetPeer } from \"./resolve-peer.js\";\n\nconst forwardSingleMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n group_id: z.number().optional(),\n user_id: z.number().optional(),\n});\n\ntype ForwardSingleMsgPayload = z.infer<typeof forwardSingleMsgSchema>;\n\n/** 单条转发依赖(OneBotApi 视图,由装配方注入)。 */\ntype ForwardSingleMsgDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\" | \"uinToUid\">;\n\n/** 单条转发基类(两个动作共用实现)。 */\nabstract class ForwardSingleMsgBase extends BaseAction<ForwardSingleMsgPayload, null> {\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: ForwardSingleMsgDeps;\n\n constructor(deps: ForwardSingleMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: ForwardSingleMsgPayload): Promise<null> {\n const { msgId, peer: sourcePeer } = resolveMsgIdAndPeer(\n payload.message_id,\n this.deps.messageUnique,\n );\n const dstPeer = await resolveTargetPeer(\n payload,\n this.deps,\n \"单条转发需要 group_id 或 user_id\",\n );\n await this.deps.msgApi.forwardSingleMessage(sourcePeer, [msgId], dstPeer);\n return null;\n }\n}\n\n/** 转发单条消息到群(P2-12)。 */\nexport class ForwardGroupSingleMsgAction extends ForwardSingleMsgBase {\n readonly name = \"forward_group_single_msg\";\n readonly schema = forwardSingleMsgSchema;\n}\n\n/** 转发单条消息到好友(P2-12)。 */\nexport class ForwardFriendSingleMsgAction extends ForwardSingleMsgBase {\n readonly name = \"forward_friend_single_msg\";\n readonly schema = forwardSingleMsgSchema;\n}\n","/**\n * CQ 码编解码(OneBot 11 消息段序列化格式)\n *\n * 纯函数、无 OB11 类型依赖:本文件只处理「文本 ↔ CQ 码片段」的通用编解码,\n * segment 级别的映射在 data.ts(OB11Constructor)。\n *\n * 转义规则(OneBot 11 规范):\n * - 纯文本:& → &amp;,[ → &#91;,] → &#93;\n * - 参数值:额外 , → &#44;\n */\n\n/** 解析单个 CQ 码文本 → 结构化 CqCode。 */\nfunction parseCqCode(raw: string): CqCode {\n const body = raw.slice(\"[CQ:\".length, -1);\n const firstComma = body.indexOf(\",\");\n let type = body;\n if (firstComma !== -1) {\n type = body.slice(0, firstComma);\n }\n const params: Record<string, string> = {};\n if (firstComma !== -1) {\n for (const pair of body.slice(firstComma + 1).split(\",\")) {\n const eq = pair.indexOf(\"=\");\n if (eq > 0) {\n params[pair.slice(0, eq)] = unescapeCqText(pair.slice(eq + 1));\n }\n }\n }\n return { type, params };\n}\n\n/** CQ 码片段([CQ:type,key=value,...] 的结构化表示)。 */\nexport interface CqCode {\n type: string;\n params: Record<string, string>;\n}\n\n/** 转义纯文本(& [ ];& 必须先转,避免二次转义)。 */\nexport function escapeCqText(text: string): string {\n return text.replaceAll(\"&\", \"&amp;\").replaceAll(\"[\", \"&#91;\").replaceAll(\"]\", \"&#93;\");\n}\n\n/** 转义 CQ 码参数值(& [ ] ,)。 */\nexport function escapeCqParam(value: string): string {\n return escapeCqText(value).replaceAll(\",\", \"&#44;\");\n}\n\n/** 反转义(&#44; &#93; &#91; &amp;;&amp; 必须最后解,避免二次转义误伤)。 */\nexport function unescapeCqText(text: string): string {\n return text\n .replaceAll(\"&#44;\", \",\")\n .replaceAll(\"&#93;\", \"]\")\n .replaceAll(\"&#91;\", \"[\")\n .replaceAll(\"&amp;\", \"&\");\n}\n\n/** 编码单个 CQ 码(undefined 参数自动省略)。 */\nexport function encodeCqCode(\n type: string,\n params: Record<string, string | number | undefined>,\n): string {\n const pairs: string[] = [];\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n pairs.push(`${key}=${escapeCqParam(String(value))}`);\n }\n }\n if (pairs.length === 0) {\n return `[CQ:${type}]`;\n }\n return `[CQ:${type},${pairs.join(\",\")}]`;\n}\n\n/**\n * 解析一条消息文本 → 文本片段与 CQ 码片段的混合数组(文本已反转义)。\n *\n * 手工 indexOf 扫描而非全局正则(/\\[CQ:[^\\]]*\\]/g):消息文本不可信,正则在\n * 「大量 [CQ: 前缀且无闭合 ]」的输入下每个起点都全量回扫,复杂度 O(n²)\n * (CodeQL polynomial-redos)。indexOf 语义等价:从 [CQ: 起到其后第一个 ]。\n */\nexport function parseCqMessage(text: string): Array<string | CqCode> {\n const parts: Array<string | CqCode> = [];\n let lastIndex = 0;\n let start = text.indexOf(\"[CQ:\");\n while (start !== -1) {\n const end = text.indexOf(\"]\", start);\n if (end === -1) {\n break; // 无闭合 ]:剩余内容整体按纯文本处理\n }\n if (start > lastIndex) {\n parts.push(unescapeCqText(text.slice(lastIndex, start)));\n }\n parts.push(parseCqCode(text.slice(start, end + 1)));\n lastIndex = end + 1;\n start = text.indexOf(\"[CQ:\", lastIndex);\n }\n if (lastIndex < text.length) {\n parts.push(unescapeCqText(text.slice(lastIndex)));\n }\n return parts;\n}\n\n/** 将混合片段数组序列化回消息文本(parseCqMessage 的逆操作)。 */\nexport function serializeCqParts(parts: Array<string | CqCode>): string {\n let out = \"\";\n for (const part of parts) {\n if (typeof part === \"string\") {\n out += escapeCqText(part);\n } else {\n out += encodeCqCode(part.type, part.params);\n }\n }\n return out;\n}\n","/**\n * OB11 segment 单元素转换(从 data.ts 拆分,2026-08-08 FTA 优化)\n *\n * - canonicalToSegment / segmentToCanonical:单元素 ↔ 单 segment(null = 无法表达跳过)\n * - CQ_SEGMENT_BUILDERS / cqCodeToSegment:CQ 码 → segment(未知类型保留原文为文本段)\n */\nimport type { CanonicalElement } from \"@napuketto/kernel\";\nimport type { OB11MessageSegment } from \"../../types/index.js\";\nimport { type CqCode, encodeCqCode, escapeCqText } from \"./cqcode.js\";\n\n/** OB11 媒体段 data(image/record/video 共用,url 可选)。 */\nfunction mediaData(file: string, url: string | undefined): { file: string; url?: string } {\n const data: { file: string; url?: string } = { file };\n if (url !== undefined) {\n data.url = url;\n }\n return data;\n}\n\n/** OB11 at 段 data(name 可选)。 */\nfunction atData(qq: string, name: string | undefined): { qq: string; name?: string } {\n const data: { qq: string; name?: string } = { qq };\n if (name !== undefined) {\n data.name = name;\n }\n return data;\n}\n\n/** canonical at 元素(display 可选)。 */\nfunction canonicalAt(target: string, display: string | undefined): CanonicalElement {\n const el: CanonicalElement = { type: \"at\", target };\n if (display !== undefined) {\n el.display = display;\n }\n return el;\n}\n\n/** canonical 媒体元素子集(image/voice/video 均含 url 可选字段)。 */\ntype MediaCanonical =\n | { type: \"image\"; path: string; url?: string; size?: { width: number; height: number } }\n | { type: \"voice\"; path: string; url?: string }\n | { type: \"video\"; path: string; url?: string };\n\n/** canonical 媒体元素(image/voice/video,url 可选;type 为联合需断言收窄)。 */\nfunction canonicalMedia(\n type: \"image\" | \"voice\" | \"video\",\n path: string,\n url: string | undefined,\n): CanonicalElement {\n const el: MediaCanonical = { type, path } as MediaCanonical;\n if (url !== undefined) {\n el.url = url;\n }\n return el;\n}\n\n/** canonical json/xml 的 raw → OB11 data 字符串(字符串原样,对象序列化)。 */\nfunction rawToString(raw: unknown): string {\n if (typeof raw === \"string\") {\n return raw;\n }\n return JSON.stringify(raw);\n}\n\n/** canonical 元素 → OB11 segment 转换器(键 = canonical type,判别字段收窄)。 */\nconst CANONICAL_TO_SEGMENT: Record<string, (el: never) => OB11MessageSegment> = {\n text: (el: Extract<CanonicalElement, { type: \"text\" }>) => ({\n type: \"text\" as const,\n data: { text: el.text },\n }),\n at: (el: Extract<CanonicalElement, { type: \"at\" }>) => ({\n type: \"at\" as const,\n data: atData(el.target, el.display),\n }),\n image: (el: Extract<CanonicalElement, { type: \"image\" }>) => ({\n type: \"image\" as const,\n data: mediaData(el.path, el.url),\n }),\n face: (el: Extract<CanonicalElement, { type: \"face\" }>) => ({\n type: \"face\" as const,\n data: { id: el.id },\n }),\n voice: (el: Extract<CanonicalElement, { type: \"voice\" }>) => ({\n type: \"record\" as const,\n data: mediaData(el.path, el.url),\n }),\n video: (el: Extract<CanonicalElement, { type: \"video\" }>) => ({\n type: \"video\" as const,\n data: mediaData(el.path, el.url),\n }),\n // 群/私聊文件(B4,2026-09-08):data.file 取文件名(缺省路径)——go-cqhttp\n // 兼容形状;此前 file 元素被静默丢弃(转换表无此键)\n file: (el: Extract<CanonicalElement, { type: \"file\" }>) => ({\n type: \"file\" as const,\n data: { file: el.name ?? el.path },\n }),\n reply: (el: Extract<CanonicalElement, { type: \"reply\" }>) => ({\n type: \"reply\" as const,\n data: { id: el.messageId },\n }),\n forward: (el: Extract<CanonicalElement, { type: \"forward\" }>) => ({\n type: \"forward\" as const,\n data: { id: el.messageIds[0] ?? \"\" },\n }),\n json: (el: Extract<CanonicalElement, { type: \"json\" }>) => ({\n type: \"json\" as const,\n data: { data: rawToString(el.raw) },\n }),\n xml: (el: Extract<CanonicalElement, { type: \"xml\" }>) => ({\n type: \"xml\" as const,\n data: { data: rawToString(el.raw) },\n }),\n};\n\n/** canonical 元素 → OB11 segment(null = OB11 无法表达,跳过)。 */\nexport function canonicalToSegment(el: CanonicalElement): OB11MessageSegment | null {\n const builder = CANONICAL_TO_SEGMENT[el.type];\n // el.type 是判别字段,与映射键一一对应;as never 规避联合逆变检查\n return builder === undefined ? null : builder(el as never);\n}\n\n/** OB11 segment → canonical 元素转换器(键 = segment type)。 */\nconst SEGMENT_TO_CANONICAL: Record<string, (seg: never) => CanonicalElement> = {\n text: (seg: Extract<OB11MessageSegment, { type: \"text\" }>) => ({\n type: \"text\" as const,\n text: seg.data.text,\n }),\n string: (seg: Extract<OB11MessageSegment, { type: \"string\" }>) => ({\n type: \"text\" as const,\n text: seg.data.text,\n }),\n at: (seg: Extract<OB11MessageSegment, { type: \"at\" }>) =>\n canonicalAt(seg.data.qq, seg.data.name),\n face: (seg: Extract<OB11MessageSegment, { type: \"face\" }>) => ({\n type: \"face\" as const,\n id: seg.data.id,\n }),\n image: (seg: Extract<OB11MessageSegment, { type: \"image\" }>) =>\n canonicalMedia(\"image\", seg.data.file, seg.data.url),\n record: (seg: Extract<OB11MessageSegment, { type: \"record\" }>) =>\n canonicalMedia(\"voice\", seg.data.file, seg.data.url),\n video: (seg: Extract<OB11MessageSegment, { type: \"video\" }>) =>\n canonicalMedia(\"video\", seg.data.file, seg.data.url),\n reply: (seg: Extract<OB11MessageSegment, { type: \"reply\" }>) => ({\n type: \"reply\" as const,\n messageId: seg.data.id,\n }),\n forward: (seg: Extract<OB11MessageSegment, { type: \"forward\" }>) => ({\n type: \"forward\" as const,\n messageIds: [seg.data.id],\n }),\n json: (seg: Extract<OB11MessageSegment, { type: \"json\" }>) => ({\n type: \"json\" as const,\n raw: seg.data.data,\n }),\n xml: (seg: Extract<OB11MessageSegment, { type: \"xml\" }>) => ({\n type: \"xml\" as const,\n raw: seg.data.data,\n }),\n};\n\n/** OB11 segment → canonical 元素(未知 type 兜底按 xml 处理,保持既有行为)。 */\nexport function segmentToCanonical(seg: OB11MessageSegment): CanonicalElement | null {\n const builder = SEGMENT_TO_CANONICAL[seg.type];\n if (builder !== undefined) {\n return builder(seg as never);\n }\n // 未知 type:兜底按 xml 处理(表字面量恒含 xml 键,此处仅类型收窄)\n const xmlBuilder = SEGMENT_TO_CANONICAL[\"xml\"];\n return xmlBuilder === undefined ? null : xmlBuilder(seg as never);\n}\n\n/** CQ 段构造器(params 键可能缺失,undefined 用空串兜底)。 */\ntype CqSegmentBuilder = (params: Record<string, string | undefined>) => OB11MessageSegment;\n\n/** 已知 CQ 类型 → segment 构造器。 */\nconst CQ_SEGMENT_BUILDERS: Record<string, CqSegmentBuilder> = {\n text: (params) => ({ type: \"text\", data: { text: params[\"text\"] ?? \"\" } }),\n at: (params) => ({ type: \"at\", data: atData(params[\"qq\"] ?? \"\", params[\"name\"]) }),\n face: (params) => ({ type: \"face\", data: { id: params[\"id\"] ?? \"\" } }),\n image: (params) => ({\n type: \"image\",\n data: mediaData(params[\"file\"] ?? \"\", params[\"url\"]),\n }),\n record: (params) => ({\n type: \"record\",\n data: mediaData(params[\"file\"] ?? \"\", params[\"url\"]),\n }),\n video: (params) => ({\n type: \"video\",\n data: mediaData(params[\"file\"] ?? \"\", params[\"url\"]),\n }),\n file: (params) => ({\n type: \"file\",\n data: { file: params[\"file\"] ?? \"\" },\n }),\n reply: (params) => ({ type: \"reply\", data: { id: params[\"id\"] ?? \"\" } }),\n forward: (params) => ({ type: \"forward\", data: { id: params[\"id\"] ?? \"\" } }),\n json: (params) => ({ type: \"json\", data: { data: params[\"data\"] ?? \"\" } }),\n xml: (params) => ({ type: \"xml\", data: { data: params[\"data\"] ?? \"\" } }),\n};\n\n/** CQ 码片段 → OB11 segment(未知类型保留原文为 text 段,往返不丢数据)。 */\nexport function cqCodeToSegment(code: CqCode): OB11MessageSegment | null {\n const builder = CQ_SEGMENT_BUILDERS[code.type];\n if (builder === undefined) {\n // 未知 CQ 类型:保留原文为文本段(go-cqhttp 兼容行为)\n return { type: \"text\", data: { text: encodeCqCode(code.type, code.params) } };\n }\n return builder(code.params);\n}\n\n/** OB11 segment 数组 → CQ 码字符串(text 段转义拼接,特殊段编码)。 */\nexport function segmentsToCqMessage(segments: OB11MessageSegment[]): string {\n let out = \"\";\n for (const seg of segments) {\n if (seg.type === \"text\" || seg.type === \"string\") {\n out += escapeCqText(seg.data.text);\n } else {\n out += encodeCqCode(seg.type, seg.data);\n }\n }\n return out;\n}\n","/**\n * OneBot 11 协议配置(zod schema,归属本包,ADR-012)\n * 协议配置 schema 在各自协议包,kernel 只提供 ConfigBase 基类。\n *\n * 2026-08-07 多实例化(P2-18):对齐 NapCat——httpServers / httpPostUrls / wsServers /\n * wsReverseUrls 四个数组实例(每实例可覆盖全局 token);旧单对象字段 http/httpPost/ws/\n * wsReverse 废弃(zod strip 静默忽略,不兼容迁移)。\n */\nimport { z } from \"zod\";\nimport { createHttpServerSchema, createWsServerSchema } from \"../../core/transport-schema.js\";\n\n/** HTTP 反向服务器默认端口。 */\nconst DEFAULT_HTTP_PORT = 3000;\n/** 反向 WS server 默认端口。 */\nconst DEFAULT_WS_PORT = 3001;\n/** 心跳 meta 事件默认间隔(毫秒)。 */\nconst DEFAULT_HEARTBEAT_INTERVAL_MS = 3000;\n/** WS 传输 ping 默认间隔(毫秒)。 */\nconst DEFAULT_WS_HEARTBEAT_MS = 30_000;\n/** WS 反向断线重连默认延迟(毫秒)。 */\nconst DEFAULT_RECONNECT_DELAY_MS = 5000;\n\n/** 消息内容格式(NapCat messagePostFormat)。 */\nconst MESSAGE_FORMATS = [\"array\", \"string\"] as const;\n\n/** HTTP 反向服务器实例(第三方 POST 指令入口)。 */\nconst httpServerSchema = createHttpServerSchema(DEFAULT_HTTP_PORT);\n\n/** HTTP 正向上报实例(Webhook 事件推送)。 */\nconst httpPostSchema = z.object({\n enabled: z.boolean().default(false),\n url: z.string().optional(),\n /** 实例级 token,覆盖全局 token(缺省继承全局)。 */\n token: z.string().optional(),\n /** 上报超时(毫秒),缺省不超时。 */\n timeoutMs: z.number().int().optional(),\n});\n\n/** 反向 WS server 实例(第三方 WS 连入,带 WS ping 间隔扩展字段)。 */\nconst wsServerSchema = createWsServerSchema(DEFAULT_WS_PORT).extend({\n /** WS ping 间隔(毫秒)。 */\n heartbeatInterval: z.number().int().default(DEFAULT_WS_HEARTBEAT_MS),\n});\n\n/** 正向 WS client 实例(主动连接第三方,双向)。 */\nconst wsReverseSchema = z.object({\n enabled: z.boolean().default(false),\n url: z.string().optional(),\n /** 实例级 token,覆盖全局 token(缺省继承全局)。 */\n token: z.string().optional(),\n /** 断线重连延迟(毫秒)。 */\n reconnectDelayMs: z.number().int().default(DEFAULT_RECONNECT_DELAY_MS),\n /** 最大重连次数(缺省无限)。 */\n maxReconnectAttempts: z.number().int().optional(),\n /** wss:// 是否校验证书(自签证书场景设 false,对齐 NapCat enableSelfSigned)。 */\n rejectUnauthorized: z.boolean().default(true),\n /** WS ping 间隔(毫秒)。 */\n heartbeatInterval: z.number().int().default(DEFAULT_WS_HEARTBEAT_MS),\n});\n\n/** OB11 配置 schema。 */\nexport const ob11ConfigSchema = z.object({\n /** 鉴权 token(全局默认,实例未指定时继承)。 */\n token: z.string().optional(),\n /** 心跳 meta 事件间隔(毫秒),0 关闭心跳。 */\n heartbeatInterval: z.number().int().default(DEFAULT_HEARTBEAT_INTERVAL_MS),\n /** 是否上报机器人自己发的消息(缺省 false = OB11 规范行为)。 */\n reportSelfMessage: z.boolean().default(false),\n /** 消息内容格式:array = 消息段数组(标准),string = CQ 码字符串。 */\n messagePostFormat: z.enum(MESSAGE_FORMATS).default(\"array\"),\n /**\n * 群文件报形式(B4,2026-09-08):false(缺省)= message 事件 + file 段\n * (go-cqhttp 兼容;此前 file 元素被静默丢弃,本版本起透出);true = 含\n * fileElement 的群消息改报 group_upload notice 事件(替代 message 事件)。\n */\n groupUploadAsNotice: z.boolean().default(false),\n /** HTTP 反向服务器列表。 */\n httpServers: z.array(httpServerSchema).default([]),\n /** HTTP 正向上报列表。 */\n httpPostUrls: z.array(httpPostSchema).default([]),\n /** 反向 WS server 列表。 */\n wsServers: z.array(wsServerSchema).default([]),\n /** 正向 WS client 列表。 */\n wsReverseUrls: z.array(wsReverseSchema).default([]),\n});\n\n/** OB11 配置类型(由 schema 推导)。 */\nexport type OB11Config = z.infer<typeof ob11ConfigSchema>;\n","/**\n * OB11 消息翻译(ADR-008 翻译层,2026-08-08 拆分)\n *\n * - 单元素 segment 转换(canonicalToSegment / segmentToCanonical)与 CQ 码\n * 构建(CQ_SEGMENT_BUILDERS / cqCodeToSegment / segmentsToCqMessage)→ segment.ts\n * - 本文件保留:批量转换(canonicalToSegments / segmentsToCanonical)与\n * 接收方向 ID 空间翻译(collectReceiveNeeds / applyReceiveContext)\n *\n * 纯函数:只读入参、无副作用,翻译只做结构映射,不调 API、不读缓存。\n * NT 实体 ↔ canonical 在 kernel(types/message-element.ts),本文件只做\n * canonical ↔ OB11(segment / CQ 码)的薄映射。\n */\n\nimport type { CanonicalElement } from \"@napuketto/kernel\";\nimport type { OB11MessageSegment } from \"../types/index.js\";\nimport {\n canonicalToSegment,\n cqCodeToSegment,\n parseCqMessage,\n segmentsToCqMessage,\n segmentToCanonical,\n} from \"./codec/index.js\";\n\n/** canonical 元素数组 → OB11 segment 数组(无法表达的元素静默跳过)。 */\nexport function canonicalToSegments(elements: CanonicalElement[]): OB11MessageSegment[] {\n const segments: OB11MessageSegment[] = [];\n for (const el of elements) {\n const seg = canonicalToSegment(el);\n if (seg !== null) {\n segments.push(seg);\n }\n }\n return segments;\n}\n\n/** OB11 segment 数组 → canonical 元素数组。 */\nexport function segmentsToCanonical(segments: OB11MessageSegment[]): CanonicalElement[] {\n const elements: CanonicalElement[] = [];\n for (const seg of segments) {\n const el = segmentToCanonical(seg);\n if (el !== null) {\n elements.push(el);\n }\n }\n return elements;\n}\n\n/**\n * 接收方向翻译上下文(ID 空间转换,P2-19,2026-08-07)。\n * 翻译核心保持纯函数(ADR-008),调用方在协议边界准备上下文注入:\n * canonical 的 at.target 是 NT uid、reply.messageId 是 NT 雪花 msgId,\n * OB11 需要 uin / OB11 message_id。\n */\n/** OB11 sender.role 值域(群聊;私聊 sender 无 role)。 */\nexport type GroupSenderRole = \"owner\" | \"admin\" | \"member\";\n\nexport interface ReceiveTranslateContext {\n /** uid → uin 映射(at 段目标转换;缺省不转换)。 */\n uidToUin?: Map<string, string>;\n /** NT msgId → OB11 message_id(reply 段转换;缺省不转换)。 */\n msgIdToOb11Id?: (msgId: string) => number | undefined;\n /** 群消息发送者角色(owner/admin,来自 GroupCache;缺省 member)。私聊忽略。 */\n senderRole?: GroupSenderRole;\n}\n\n/**\n * 收集 canonical 元素里需要转换的 at uid / reply NT msgId(接收方向)。\n * 调用方据此批量 uidToUin(一次异步调用),避免逐元素查询。\n */\nexport function collectReceiveNeeds(elements: CanonicalElement[]): {\n atUids: string[];\n replyMsgIds: string[];\n} {\n const atUids = new Set<string>();\n const replyMsgIds = new Set<string>();\n for (const el of elements) {\n if (el.type === \"at\" && el.target !== \"all\") {\n atUids.add(el.target);\n } else if (el.type === \"reply\") {\n replyMsgIds.add(el.messageId);\n }\n }\n return { atUids: [...atUids], replyMsgIds: [...replyMsgIds] };\n}\n\n/**\n * canonical 元素数组 → 应用接收方向 ID 转换(at uid→uin、reply NT msgId→OB11 id)。\n * 转换失败的元素原样保留(uid 未解析 / msgId 未映射——不阻塞上报)。\n */\nexport function applyReceiveContext(\n elements: CanonicalElement[],\n ctx: ReceiveTranslateContext,\n): CanonicalElement[] {\n if (ctx.uidToUin === undefined && ctx.msgIdToOb11Id === undefined) {\n return elements;\n }\n const out: CanonicalElement[] = [];\n for (const el of elements) {\n if (el.type === \"at\" && el.target !== \"all\") {\n const uin = ctx.uidToUin?.get(el.target);\n out.push(uin !== undefined ? { ...el, target: uin } : el);\n continue;\n }\n if (el.type === \"reply\") {\n const id = ctx.msgIdToOb11Id?.(el.messageId);\n out.push(id !== undefined ? { ...el, messageId: String(id) } : el);\n continue;\n }\n out.push(el);\n }\n return out;\n}\n\n/**\n * 发送方向翻译上下文(ID 空间转换,P2-19,2026-08-07)。\n * OB11 的 at.qq 是 uin、reply.id 是 OB11 message_id,canonical 需要 uid / NT msgId。\n */\nexport interface SendTranslateContext {\n /** uin → uid 映射(at 段目标转换;缺省不转换)。 */\n uinToUid?: Map<string, string>;\n /** OB11 message_id → NT msgId(reply 段转换;缺省原样透传)。 */\n ob11IdToMsgId?: (id: number) => string | undefined;\n}\n\n/** at 段:uin → uid(缺省不转换)。 */\nfunction translateAtElement(\n el: Extract<CanonicalElement, { type: \"at\" }>,\n ctx: SendTranslateContext,\n): CanonicalElement {\n const uid = ctx.uinToUid?.get(el.target);\n return uid !== undefined ? { ...el, target: uid } : el;\n}\n\n/** reply 段:OB11 message_id → NT msgId(反查不到原样透传)。 */\nfunction translateReplyElement(\n el: Extract<CanonicalElement, { type: \"reply\" }>,\n ctx: SendTranslateContext,\n): CanonicalElement {\n const num = Number(el.messageId);\n if (Number.isNaN(num)) {\n return el;\n }\n const msgId = ctx.ob11IdToMsgId?.(num);\n return msgId !== undefined ? { ...el, messageId: msgId } : el;\n}\n\n/**\n * canonical 元素数组 → 应用发送方向 ID 转换(at uin→uid、reply OB11 id→NT msgId)。\n * reply 反查不到时原样透传(兼容客户端直接给 NT msgId 的输入,不报错)。\n */\nexport function applySendContext(\n elements: CanonicalElement[],\n ctx: SendTranslateContext,\n): CanonicalElement[] {\n if (ctx.uinToUid === undefined && ctx.ob11IdToMsgId === undefined) {\n return elements;\n }\n const out: CanonicalElement[] = [];\n for (const el of elements) {\n if (el.type === \"at\" && el.target !== \"all\") {\n out.push(translateAtElement(el, ctx));\n continue;\n }\n if (el.type === \"reply\") {\n out.push(translateReplyElement(el, ctx));\n continue;\n }\n out.push(el);\n }\n return out;\n}\n\n/** CQ 码字符串 → OB11 segment 数组(未知 CQ 类型保留为 text 段原文)。 */\nexport function cqMessageToSegments(text: string): OB11MessageSegment[] {\n const segments: OB11MessageSegment[] = [];\n for (const part of parseCqMessage(text)) {\n if (typeof part === \"string\") {\n if (part.length > 0) {\n segments.push({ type: \"text\", data: { text: part } });\n }\n } else {\n const seg = cqCodeToSegment(part);\n if (seg !== null) {\n segments.push(seg);\n }\n }\n }\n return segments;\n}\n\n/** canonical 元素数组 → CQ 码字符串。 */\nexport function canonicalToCqMessage(elements: CanonicalElement[]): string {\n return segmentsToCqMessage(canonicalToSegments(elements));\n}\n\n/** CQ 码字符串 → canonical 元素数组。 */\nexport function cqMessageToCanonical(text: string): CanonicalElement[] {\n return segmentsToCanonical(cqMessageToSegments(text));\n}\n","/**\n * OB11 消息信息翻译(RawMessage → OB11 消息信息结构)\n *\n * get_msg / get_group_msg_history / get_friend_msg_history 返回项用。\n * 纯函数(ADR-008):只读入参,不调 API、不读缓存。\n * 与 adapter.ts 的 toOb11MessageEvent(事件格式,带 self_id/post_type)是两套结构,不复用。\n */\nimport type { RawMessage } from \"@napuketto/kernel\";\nimport { ChatType, toCanonicalElements } from \"@napuketto/kernel\";\nimport type { OB11MessageInfo } from \"../types/index.js\";\nimport {\n applyReceiveContext,\n canonicalToCqMessage,\n canonicalToSegments,\n type ReceiveTranslateContext,\n} from \"./data.js\";\nimport type { MessageUnique } from \"./message-unique.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/** RawMessage → OB11 消息信息(message_id 经 MessageUnique 映射)。\n * ctx(可选):接收方向 ID 转换上下文(at uid→uin、reply NT msgId→OB11 id,P2-19)。 */\nexport function toOb11MessageInfo(\n msg: RawMessage,\n unique: MessageUnique,\n ctx: ReceiveTranslateContext = {},\n): OB11MessageInfo {\n const elements = applyReceiveContext(toCanonicalElements(msg), ctx);\n let messageType: \"group\" | \"private\" = \"private\";\n if (msg.chatType === ChatType.GROUP) {\n messageType = \"group\";\n }\n const info: OB11MessageInfo = {\n message_id: unique.alloc(msg.msgId, {\n chatType: msg.chatType,\n peerUid: msg.peerUid,\n }),\n message_type: messageType,\n sender: {\n user_id: Number(msg.senderUin),\n nickname: msg.sendNickName,\n },\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n message: canonicalToSegments(elements),\n raw_message: canonicalToCqMessage(elements),\n };\n if (msg.chatType === ChatType.GROUP) {\n info.group_id = Number(msg.peerUid);\n const { sender } = info;\n // 发送者角色由调用方经 ctx 注入(GroupCache 查询在协议边界,翻译纯函数)\n sender.role = ctx.senderRole ?? \"member\";\n if (msg.sendMemberName !== undefined) {\n sender.card = msg.sendMemberName;\n }\n } else {\n // 2026-08-07 修复:user_id 应为发送者(senderUin),与消息事件一致。\n // 此前用 peerUin(会话对端)——机器人自己发的消息 user_id 会错成对端。\n info.user_id = Number(msg.senderUin);\n }\n return info;\n}\n","/**\n * OB11 notice 事件翻译(P2-7,2026-08-05;2026-09-08 T4 补全)\n *\n * NT QQ 中群成员变动/撤回等系统事件通过**消息的灰色提示元素(grayTip)**广播。\n * 本模块把 RawMessage 里的 grayTip 翻译为 OB11 notice 事件(纯函数,ADR-008)。\n *\n * 支持:\n * - group_recall(群撤回,grayTip.subElementType=REVOKE + chatType=GROUP)\n * - friend_recall(好友撤回,REVOKE + chatType=C2C,2026-09-08)\n * - group_increase / group_decrease(群成员变动,subElementType=GROUP + TipGroupElement.type)\n * - group_admin(管理员变更,TipGroupElement.type=BLOCK/UNBLOCK 的 role 语义)\n * - group_ban(禁言,TipGroupElement.type=SHUT_UP)\n * - notify.poke(戳一戳,aioOpGrayTipElement;⚠️ 待真实 poke 事件验证,2026-09-08)\n *\n * 未知/未翻译的 grayTip 子类型(JSON/BUDDY/ESSENCE/GROUP_NOTIFY 等)打 raw JSON\n * 日志(ctx.logger 可选)——为后续真实事件校准积累数据。\n *\n * user_id/operator_id 都是 uin:接收 uidToUin Map(调用方批量转换后传入,保持纯函数)。\n */\n\nimport type { BuddyListEntry } from \"@napuketto/kernel\";\nimport {\n ChatType,\n type GrayTipElement,\n GrayTipSubType,\n type RawMessage,\n type TipGroupElement,\n TipGroupElementType,\n} from \"@napuketto/kernel\";\n\nexport { collectGrayTipUids } from \"../../core/gray-tip.js\";\n\nimport { firstUntranslatedGrayTip } from \"../../core/gray-tip.js\";\n\nimport type {\n OB11Event,\n OB11FriendAddNoticeEvent,\n OB11FriendRecallNoticeEvent,\n OB11GroupAdminNoticeEvent,\n OB11GroupBanNoticeEvent,\n OB11GroupDecreaseNoticeEvent,\n OB11GroupIncreaseNoticeEvent,\n OB11GroupRecallNoticeEvent,\n OB11GroupUploadNoticeEvent,\n OB11NotifyNoticeEvent,\n} from \"../event/index.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/** 群文件业务类型(group_upload 的 file.busid,与 kernel 群文件系列同源语义)。 */\nconst GROUP_FILE_BUS_ID = 102;\n\n/** 检查消息是否含文件元素(group_upload 开关分支判定)。 */\nexport function hasFileElement(msg: RawMessage): boolean {\n return msg.elements.some((el) => el.fileElement !== undefined);\n}\n\n/** grayTip 翻译上下文(uid→uin 映射,调用方批量转换)。 */\nexport interface NoticeTranslateContext {\n selfUin: string;\n uidToUin: Map<string, string>;\n /** 校准日志(可选:未知 grayTip 子类型/poke raw JSON;缺省静默)。 */\n logger?: { warn(obj: unknown, msg?: string): void };\n}\n\n/** 检查消息是否含可翻译的 grayTip 元素。 */\nexport function hasGrayTip(msg: RawMessage): boolean {\n return msg.elements.some((el) => el.grayTipElement !== undefined);\n}\n\n/** uid → uin(上下文映射缺省退化为 uid)。 */\nfunction toUin(uid: string, ctx: NoticeTranslateContext): number {\n const uin = ctx.uidToUin.get(uid);\n return Number(uin ?? uid);\n}\n\n/** 基础字段(time/self_id/post_type)。 */\nfunction base(\n msg: RawMessage,\n ctx: NoticeTranslateContext,\n): {\n time: number;\n self_id: number;\n post_type: \"notice\";\n group_id: number;\n} {\n return {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n post_type: \"notice\",\n group_id: Number(msg.peerUid),\n };\n}\n\n/** 撤回事件(chatType 分流:GROUP→group_recall / C2C→friend_recall,2026-09-08)。 */\nfunction toRecall(\n msg: RawMessage,\n g: GrayTipElement,\n ctx: NoticeTranslateContext,\n): OB11GroupRecallNoticeEvent | OB11FriendRecallNoticeEvent | null {\n if (g?.revokeElement === undefined) {\n return null;\n }\n const revoke = g.revokeElement;\n if (msg.chatType === ChatType.C2C) {\n // 好友撤回:user_id = 撤回者,message_id = msgSeq\n return {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n post_type: \"notice\",\n notice_type: \"friend_recall\",\n user_id: toUin(revoke.operatorUid, ctx),\n message_id: Number(msg.msgSeq),\n };\n }\n return {\n ...base(msg, ctx),\n notice_type: \"group_recall\",\n user_id: toUin(revoke.operatorUid, ctx),\n operator_id: toUin(revoke.operatorUid, ctx),\n message_id: Number(msg.msgSeq),\n };\n}\n\n/**\n * 戳一戳(notify.poke,aioOpGrayTipElement,2026-09-08)。\n *\n * ⚠️ 待真实 poke 事件验证:aioOp 载荷的完整字段形状未经实测(实体类型仅有\n * operateType/peerUid 两个已证字段)。当前口径:user_id = 消息发送者,\n * target_id = aioOp.peerUid(C2C 即对端;群内为目标 uid 的假设待校准),\n * group_id = 群号(C2C 为 0)。poke 路径始终打 raw 日志积累校准数据。\n */\nfunction toPoke(\n msg: RawMessage,\n g: GrayTipElement,\n ctx: NoticeTranslateContext,\n): OB11NotifyNoticeEvent {\n const aioOp = g?.aioOpGrayTipElement;\n ctx.logger?.warn(\n { raw: JSON.stringify(g)?.slice(0, 2000) },\n \"ob11: poke grayTip raw(待真实事件校准)\",\n );\n const isGroup = msg.chatType === ChatType.GROUP;\n return {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n post_type: \"notice\",\n notice_type: \"notify\",\n sub_type: \"poke\",\n group_id: isGroup ? Number(msg.peerUid) : 0,\n user_id: toUin(msg.senderUid, ctx),\n target_id: toUin(aioOp?.peerUid ?? \"\", ctx),\n };\n}\n\n/** 群成员变动事件族(increase/decrease/admin/ban 的联合,映射器返回类型)。 */\ntype OB11GroupEvent =\n | OB11GroupIncreaseNoticeEvent\n | OB11GroupDecreaseNoticeEvent\n | OB11GroupAdminNoticeEvent\n | OB11GroupBanNoticeEvent;\n\n/** 群成员变动公共字段。 */\ninterface GroupChangeCommon {\n time: number;\n selfId: number;\n groupId: number;\n memberUid: string;\n adminUid: string;\n}\n\n/** 群成员变动映射器表(键 = TipGroupElementType;缺项 = 不可翻译返回 null)。 */\nconst GROUP_CHANGE_BUILDERS: Partial<\n Record<\n TipGroupElementType,\n (\n common: GroupChangeCommon,\n grp: TipGroupElement,\n ctx: NoticeTranslateContext,\n ) => OB11GroupEvent | null\n >\n> = {\n [TipGroupElementType.MEMBER_ADD]: toMemberAdd,\n [TipGroupElementType.QUIT]: toQuit,\n [TipGroupElementType.BLOCK]: toAdminChange,\n [TipGroupElementType.UNBLOCK]: toAdminChange,\n [TipGroupElementType.SHUT_UP]: toBan,\n};\n\n/** 群成员变动(group_increase / group_decrease / group_admin / group_ban)。 */\nfunction toGroupChange(\n msg: RawMessage,\n g: GrayTipElement,\n ctx: NoticeTranslateContext,\n): OB11GroupEvent | null {\n const grp = g?.groupElement;\n if (grp === undefined || grp.type === undefined) {\n return null;\n }\n const builder = GROUP_CHANGE_BUILDERS[grp.type];\n if (builder === undefined) {\n return null;\n }\n return builder(\n {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n selfId: Number(ctx.selfUin),\n groupId: Number(msg.peerUid),\n memberUid: grp.memberUid ?? \"\",\n adminUid: grp.adminUid ?? \"\",\n },\n grp,\n ctx,\n );\n}\n\n/** 群成员增加(approve=管理员操作 / invite=普通邀请)。 */\nfunction toMemberAdd(\n common: GroupChangeCommon,\n _grp: TipGroupElement,\n ctx: NoticeTranslateContext,\n): OB11GroupIncreaseNoticeEvent {\n const { time, selfId, groupId, memberUid, adminUid } = common;\n return {\n time,\n self_id: selfId,\n post_type: \"notice\",\n notice_type: \"group_increase\",\n sub_type: adminUid === memberUid ? \"approve\" : \"invite\",\n group_id: groupId,\n operator_id: toUin(adminUid, ctx),\n user_id: toUin(memberUid, ctx),\n };\n}\n\n/** 群成员退出(leave)。 */\nfunction toQuit(\n common: GroupChangeCommon,\n _grp: TipGroupElement,\n ctx: NoticeTranslateContext,\n): OB11GroupDecreaseNoticeEvent {\n const { time, selfId, groupId, memberUid, adminUid } = common;\n return {\n time,\n self_id: selfId,\n post_type: \"notice\",\n notice_type: \"group_decrease\",\n sub_type: \"leave\",\n group_id: groupId,\n operator_id: toUin(adminUid, ctx),\n user_id: toUin(memberUid, ctx),\n };\n}\n\n/** 管理员变更(BLOCK=set / UNBLOCK=unset)。 */\nfunction toAdminChange(\n common: GroupChangeCommon,\n grp: TipGroupElement,\n ctx: NoticeTranslateContext,\n): OB11GroupAdminNoticeEvent {\n const { time, selfId, groupId, memberUid, adminUid } = common;\n return {\n time,\n self_id: selfId,\n post_type: \"notice\",\n notice_type: \"group_admin\",\n sub_type: grp.type === TipGroupElementType.BLOCK ? \"set\" : \"unset\",\n group_id: groupId,\n user_id: toUin(memberUid === \"\" ? adminUid : memberUid, ctx),\n };\n}\n\n/** 禁言(duration>0=ban / 否则 lift_ban)。 */\nfunction toBan(\n common: GroupChangeCommon,\n grp: TipGroupElement,\n ctx: NoticeTranslateContext,\n): OB11GroupBanNoticeEvent {\n const shutUp = grp.shutUp;\n const duration = Number(shutUp?.duration ?? 0);\n return {\n time: common.time,\n self_id: common.selfId,\n post_type: \"notice\",\n notice_type: \"group_ban\",\n sub_type: duration > 0 ? \"ban\" : \"lift_ban\",\n group_id: common.groupId,\n operator_id: toUin(shutUp?.admin?.uid ?? common.adminUid, ctx),\n user_id: toUin(shutUp?.member?.uid ?? common.memberUid, ctx),\n duration,\n };\n}\n\n/**\n * 好友添加(friend_add,B2,2026-09-08)。\n * 数据源 = kernel BuddyCache 快照 diff(Buddy/onBuddyListChange 全量快照对比,\n * 首帧 baseline 不发)——非 grayTip 路径。user_id 取 coreInfo.uin(顶层 uin 兜底)。\n */\nexport function toFriendAdd(entry: BuddyListEntry, selfUin: string): OB11FriendAddNoticeEvent {\n const uin = entry.coreInfo?.uin ?? entry.uin ?? \"\";\n return {\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(selfUin),\n post_type: \"notice\",\n notice_type: \"friend_add\",\n user_id: Number(uin),\n };\n}\n\n/**\n * 群文件上传(group_upload,B4,2026-09-08)。\n * 数据源 = 含 fileElement 的群消息(开关 groupUploadAsNotice=true 时替代\n * message 事件报出)。file.id 取 fileUuid(缺省文件名)、size 取 fileSize、\n * busid 固定 102(群文件业务类型,与 kernel GROUP_FILE_BIZ_TYPE 同源语义)。\n */\nexport function toGroupUpload(msg: RawMessage, selfUin: string): OB11GroupUploadNoticeEvent | null {\n const el = msg.elements.find((e) => e.fileElement !== undefined);\n const file = el?.fileElement;\n if (file === undefined) {\n return null;\n }\n return {\n time: Math.floor(Number(msg.msgTime) / MS_TO_SEC),\n self_id: Number(selfUin),\n post_type: \"notice\",\n notice_type: \"group_upload\",\n group_id: Number(msg.peerUid),\n user_id: Number(msg.senderUin),\n file: {\n id: file.fileUuid ?? file.fileName ?? \"\",\n name: file.fileName ?? \"\",\n size: Number(file.fileSize ?? 0),\n busid: GROUP_FILE_BUS_ID,\n },\n };\n}\n\n/** 单个 grayTip 元素 → notice 事件(null = 不可翻译;未知子类型打 raw 日志)。 */\nfunction translateGrayTip(\n msg: RawMessage,\n g: GrayTipElement,\n ctx: NoticeTranslateContext,\n): OB11Event | null {\n const subType = g.subElementType;\n if (subType === GrayTipSubType.REVOKE) {\n return toRecall(msg, g, ctx);\n }\n if (subType === GrayTipSubType.GROUP) {\n return toGroupChange(msg, g, ctx);\n }\n if (g.aioOpGrayTipElement !== undefined) {\n // poke(aioOp):subElementType 归属未实证(BUDDY_NOTIFY/GROUP_NOTIFY 载荷),\n // 以元素存在性识别;始终打 raw 日志(toPoke 内)\n return toPoke(msg, g, ctx);\n }\n // 未知/未翻译子类型:raw 日志(JSON/BUDDY/ESSENCE/GROUP_NOTIFY/FILE 等——\n // friend_add/lucky_notify/honor/essence 等翻译的数据源校准入口)\n logUntranslatedGrayTip(msg, ctx);\n return null;\n}\n\n// 未知/未翻译子类型 raw 日志(与 Milky notice 同源,core 提取器定位元素)\nfunction logUntranslatedGrayTip(msg: RawMessage, ctx: NoticeTranslateContext): void {\n const untranslated = firstUntranslatedGrayTip(msg);\n if (untranslated !== undefined) {\n ctx.logger?.warn(\n {\n subType: untranslated.subElementType,\n raw: JSON.stringify(untranslated)?.slice(0, 2000),\n },\n \"ob11: 未翻译的 grayTip 子类型(raw 校准数据)\",\n );\n }\n}\n\n/** RawMessage → OB11 notice 事件(无 grayTip 返回 null)。\n * 未知/未翻译子类型打 raw JSON 日志(校准数据积累,2026-09-08)。 */\nexport function toOb11NoticeEvent(msg: RawMessage, ctx: NoticeTranslateContext): OB11Event | null {\n for (const el of msg.elements) {\n const g = el.grayTipElement;\n if (g === undefined) {\n continue;\n }\n const event = translateGrayTip(msg, g, ctx);\n if (event !== null) {\n return event;\n }\n }\n return null;\n}\n","/**\n * OB11 request 事件翻译(2026-09-08)\n *\n * 事件源(kernel 事件通道,本次接线):\n * - `Group/onGroupNotifiesUpdated`(GroupBridge,群系统通知推送)→ group_add / group_invite\n * - `Buddy/onBuddyReqChange`(FriendBridge,好友申请推送)→ friend\n *\n * flag 语义(与应答动作匹配路径一致):\n * - 群请求 flag = GroupNotify.seq(set_group_add_request 按 `item.seq === flag` 匹配)\n * - 好友请求 flag = BuddyReq.reqTime(set_friend_add_request 按 `reqTime === flag` 匹配)\n *\n * 纯函数(ADR-008):uid→uin 由调用方批量转换后传入。\n * ⚠️ onBuddyReqChange 回调参数形状未经真实事件校准(wrapper 字符串证据仅有方法名),\n * narrowBuddyReqs 防御性收窄,未知形状返回 null 由调用方打 raw 日志积累校准数据。\n */\n\nimport {\n type BuddyReq,\n type GroupNotify,\n GroupNotifyMsgStatus,\n GroupNotifyMsgType,\n} from \"@napuketto/kernel\";\nimport { MS_TO_SEC, type RequestTranslateContext, resolveUin } from \"../../core/uid-uin.js\";\n\nexport type { RequestTranslateContext } from \"../../core/uid-uin.js\";\n\nimport type { OB11FriendRequestEvent, OB11GroupRequestEvent } from \"../event/index.js\";\n\n/** uid → uin(core 共享解析;ctx 携带映射)。 */\nfunction toUin(uid: string | undefined, ctx: RequestTranslateContext): number {\n return resolveUin(uid, ctx.uidToUin);\n}\n\n/**\n * GroupNotify → OB11 群请求事件(group_add / group_invite)。\n *\n * type 语义与 get_group_system_msg 动作同一解释:1/5=邀请(invite)、7=申请(add);\n * 仅未处理状态(KUNHANDLE)推送——已处理通知重复推送不再发事件。\n * 非请求类通知(踢人/转让等处理结果回执)返回 null。\n */\nexport function toOb11GroupRequestEvent(\n notify: GroupNotify,\n ctx: RequestTranslateContext,\n): OB11GroupRequestEvent | null {\n if (notify.status !== GroupNotifyMsgStatus.KUNHANDLE) {\n return null;\n }\n let subType: \"add\" | \"invite\";\n switch (notify.type) {\n case GroupNotifyMsgType.INVITED_BY_MEMBER:\n case GroupNotifyMsgType.INVITED_NEED_ADMINI_STRATOR_PASS:\n subType = \"invite\";\n break;\n case GroupNotifyMsgType.REQUEST_JOIN_NEED_ADMINI_STRATOR_PASS:\n subType = \"add\";\n break;\n default:\n return null;\n }\n // user1 语义:invite=邀请人 / add=申请人(与 get_group_system_msg 的 invitor 口径一致)\n return {\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n post_type: \"request\",\n request_type: \"group\",\n sub_type: subType,\n group_id: Number(notify.group?.groupCode ?? 0),\n user_id: toUin(notify.user1?.uid, ctx),\n comment: notify.postscript ?? \"\",\n flag: String(notify.seq),\n };\n}\n\n/** BuddyReq 防御性收窄收敛到 core(OB11 / Milky 共用,P1 2026-10-30)。 */\nexport { isBuddyReqLike, narrowBuddyReqs } from \"../../core/buddy-req.js\";\n\n/**\n * BuddyReq → OB11 好友请求事件(friend)。\n * comment 取 words 字段(验证留言,形状待校准,缺省空串);flag = reqTime。\n */\nexport function toOb11FriendRequestEvent(\n req: BuddyReq,\n ctx: RequestTranslateContext,\n): OB11FriendRequestEvent {\n const words = req[\"words\"];\n return {\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(ctx.selfUin),\n post_type: \"request\",\n request_type: \"friend\",\n user_id: toUin(req.friendUid, ctx),\n comment: typeof words === \"string\" ? words : \"\",\n flag: req.reqTime,\n };\n}\n","/**\n * get_forward_msg 动作:获取合并转发内容(P2-12 接 kernel MsgApi.fetchForwardMessage)\n *\n * message_id / id → 反查 msgId + peer → fetchForwardMessage(getMultiMsg)→\n * 每条 toOb11MessageInfo → { messages }。\n */\n\nimport { kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { toOb11MessageInfo } from \"../../helper/index.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getForwardMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]).optional(),\n id: z.union([z.number(), z.string()]).optional(),\n});\n\ntype GetForwardMsgPayload = z.infer<typeof getForwardMsgSchema>;\n\n/** 获取合并转发内容(P2-12 接 kernel fetchForwardMessage)。 */\nexport class GetForwardMsgAction extends BaseAction<\n GetForwardMsgPayload,\n { messages: OB11MessageInfo[] }\n> {\n readonly name = \"get_forward_msg\";\n readonly schema = getForwardMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"msgApi\" | \"messageUnique\">;\n\n constructor(deps: Pick<OneBotApi, \"msgApi\" | \"messageUnique\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(\n payload: GetForwardMsgPayload,\n ): Promise<{ messages: OB11MessageInfo[] }> {\n const id = payload.message_id ?? payload.id;\n if (id === undefined) {\n throw kernelError(\"get_forward_msg 需要 message_id 或 id\", \"INVALID_PARAM\");\n }\n const { msgId, peer } = resolveMsgIdAndPeer(id, this.deps.messageUnique);\n const msgs = await this.deps.msgApi.fetchForwardMessage(peer, msgId);\n return {\n messages: msgs.map((msg) => toOb11MessageInfo(msg, this.deps.messageUnique)),\n };\n }\n}\n","/**\n * 历史消息动作共享逻辑(get_friend_msg_history / get_group_msg_history 共用,2026-08-08 克隆合并)\n *\n * - resolveStartMsgId:message_seq(OB11 int32 或 NT msgId)→ 起始 msgId\n * - fetchAndTranslateHistory:拉取历史消息 → at uid 批量转换 → OB11 消息信息数组\n */\n\nimport { ChatType, kernelError, toCanonicalElements } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport {\n collectReceiveNeeds,\n type GroupSenderRole,\n type ReceiveTranslateContext,\n toOb11MessageInfo,\n} from \"../../helper/index.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\n\n/** 历史消息依赖(OneBotApi 视图,由装配方注入)。 */\nexport type MsgHistoryDeps = Pick<\n OneBotApi,\n \"msgApi\" | \"messageUnique\" | \"uidToUin\" | \"groupMemberRoles\"\n>;\n\n/** 默认历史消息条数。 */\nconst DEFAULT_HISTORY_COUNT = 20;\n\n/** 历史消息公共参数(message_seq / count / 反向排序)。 */\nexport const msgHistoryParamsSchema = {\n /** 起始消息序号(message_seq,缺省从最新拉)。 */\n message_seq: z.union([z.number(), z.string()]).optional(),\n count: z.number().default(DEFAULT_HISTORY_COUNT),\n /** 是否反向排序(NapCat 扩展)。 */\n reverse_order: z.boolean().optional(),\n reverseOrder: z.boolean().optional(),\n} as const;\n\n/** 解析 message_seq → 起始 msgId(int32 经 MessageUnique 反查,否则原样透传)。 */\nfunction resolveStartMsgId(\n messageSeq: number | string | undefined,\n messageUnique: MsgHistoryDeps[\"messageUnique\"],\n): string | undefined {\n if (messageSeq === undefined) {\n return undefined;\n }\n const raw = String(messageSeq);\n const shortId = Number(raw);\n if (Number.isFinite(shortId)) {\n return messageUnique.getMsgId(shortId) ?? raw;\n }\n return raw;\n}\n\n/**\n * 拉取历史消息并翻译为 OB11 消息信息数组。\n * 收集全部消息 at uid → 一次批量 uidToUin → 上下文注入(P2-19)。\n * 群聊另取发送者角色表(GroupCache 一次整表读取,失败回退缺省 member)。\n */\nexport async function fetchAndTranslateHistory(\n peer: { chatType: ChatType; peerUid: string },\n messageSeq: number | string | undefined,\n count: number,\n deps: MsgHistoryDeps,\n): Promise<{ messages: OB11MessageInfo[] }> {\n const startMsgId = resolveStartMsgId(messageSeq, deps.messageUnique);\n const opts: { count: number; msgId?: string } = { count };\n if (startMsgId !== undefined) {\n opts.msgId = startMsgId;\n }\n const msgs = await deps.msgApi.fetchMessages(peer, opts);\n if (msgs.length === 0) {\n throw kernelError(`消息 ${messageSeq ?? \"0\"} 不存在`, \"NOT_FOUND\");\n }\n // P2-19:收集全部消息 at uid → 一次批量 uidToUin → 上下文注入\n const atUids = new Set<string>();\n for (const m of msgs) {\n const { atUids: uids } = collectReceiveNeeds(toCanonicalElements(m));\n for (const u of uids) {\n atUids.add(u);\n }\n }\n let uidToUin: Map<string, string> | undefined;\n if (atUids.size > 0) {\n try {\n uidToUin = await deps.uidToUin([...atUids]);\n } catch {\n // uid 解析失败:at 原样(uid)\n }\n }\n const ctx: ReceiveTranslateContext = {\n ...(uidToUin !== undefined ? { uidToUin } : {}),\n msgIdToOb11Id: (m) => deps.messageUnique.getMessageId(m),\n };\n let senderRoles: Map<string, GroupSenderRole> | undefined;\n if (peer.chatType === ChatType.GROUP) {\n senderRoles = await deps.groupMemberRoles(peer.peerUid);\n }\n return {\n messages: msgs.map((msg) => {\n const role = senderRoles?.get(msg.senderUid);\n return toOb11MessageInfo(msg, deps.messageUnique, {\n ...ctx,\n ...(role !== undefined ? { senderRole: role } : {}),\n });\n }),\n };\n}\n","/**\n * get_friend_msg_history 动作:获取私聊历史消息(NapCat 扩展,P2-10)\n *\n * user_id → uin→uid → Peer{ C2C } → fetchMessages → 数组翻译。\n */\n\nimport { ChatType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\nimport {\n fetchAndTranslateHistory,\n type MsgHistoryDeps,\n msgHistoryParamsSchema,\n} from \"./msg-history.js\";\n\nconst getFriendMsgHistorySchema = z.object({\n user_id: z.number(),\n ...msgHistoryParamsSchema,\n});\n\ntype GetFriendMsgHistoryPayload = z.infer<typeof getFriendMsgHistorySchema>;\n\n/** 获取私聊历史消息(P2-10 接 kernel fetchMessages)。 */\nexport class GetFriendMsgHistoryAction extends BaseAction<\n GetFriendMsgHistoryPayload,\n { messages: OB11MessageInfo[] }\n> {\n readonly name = \"get_friend_msg_history\";\n readonly schema = getFriendMsgHistorySchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: MsgHistoryDeps & {\n uinToUid: (uins: string[]) => Promise<Map<string, string>>;\n };\n\n constructor(\n deps: MsgHistoryDeps & { uinToUid: (uins: string[]) => Promise<Map<string, string>> },\n ) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(\n payload: GetFriendMsgHistoryPayload,\n ): Promise<{ messages: OB11MessageInfo[] }> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n const peer = { chatType: ChatType.C2C, peerUid: uid };\n return await fetchAndTranslateHistory(peer, payload.message_seq, payload.count, this.deps);\n }\n}\n","/**\n * get_group_msg_history 动作:获取群历史消息(go-cqhttp 扩展,P2-10)\n *\n * group_id → Peer{ GROUP } → MsgApi.fetchMessages(message_seq 起,count 条)\n * → 数组翻译为 OB11 消息信息。\n */\n\nimport { ChatType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport {\n fetchAndTranslateHistory,\n type MsgHistoryDeps,\n msgHistoryParamsSchema,\n} from \"./msg-history.js\";\n\nconst getGroupMsgHistorySchema = z.object({\n group_id: z.number(),\n ...msgHistoryParamsSchema,\n});\n\ntype GetGroupMsgHistoryPayload = z.infer<typeof getGroupMsgHistorySchema>;\n\n/** 获取群历史消息(P2-10 接 kernel fetchMessages)。 */\nexport class GetGroupMsgHistoryAction extends BaseAction<\n GetGroupMsgHistoryPayload,\n { messages: OB11MessageInfo[] }\n> {\n readonly name = \"get_group_msg_history\";\n readonly schema = getGroupMsgHistorySchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: MsgHistoryDeps;\n\n constructor(deps: MsgHistoryDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(\n payload: GetGroupMsgHistoryPayload,\n ): Promise<{ messages: OB11MessageInfo[] }> {\n const peer = { chatType: ChatType.GROUP, peerUid: String(payload.group_id) };\n return await fetchAndTranslateHistory(peer, payload.message_seq, payload.count, this.deps);\n }\n}\n","/**\n * get_image / get_record 动作:获取图片/语音文件(P2-14;2026-09-08 T5 接主动下载;\n * 2026-09-08 B1 语音接原生 downloadRichMedia)\n *\n * message_id 反查 → fetchMsgsByMsgId → 找 PIC/PTT 元素:\n * - 本地文件解析:NT 相对路径(sourcePath/filePath)按 mediaBaseDir(QQ NT\n * global 目录)解析为绝对路径,命中磁盘即返回 file\n * - 图片主动下载:本地未命中且有 picUrl → @napuketto/media downloadUrl 落\n * cacheDir/media/,返回 file(绝对路径)+ url + file_size/file_name\n * - 语音主动下载(B1):本地未命中 → kernel MsgApi.downloadPtt(原生\n * downloadRichMedia + 轮询元素回查)→ filePath 落盘后返回绝对路径;\n * 失败回退原始 filePath(NT 相对/绝对)+ 元数据,不抛错\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { kernelError, type RawElement } from \"@napuketto/kernel\";\nimport { downloadUrl, inferExtension } from \"@napuketto/media\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getMediaSchema = z.object({\n /** CQ 码 file 字段或 message_id(简化:message_id 反查)。 */\n file: z.string().optional(),\n message_id: z.union([z.number(), z.string()]).optional(),\n});\n\ntype GetMediaPayload = z.infer<typeof getMediaSchema>;\n\n/** 媒体信息返回。 */\nexport interface MediaInfoResult {\n file?: string;\n url?: string;\n file_size?: string;\n file_name?: string;\n base64?: string;\n}\n\n/** 媒体动作依赖(OneBotApi 视图)。 */\nexport type GetMediaDeps = Pick<\n OneBotApi,\n \"msgApi\" | \"messageUnique\" | \"cacheDir\" | \"mediaBaseDir\"\n>;\n\n/**\n * NT 相对路径 → 本地绝对路径(存在才返回)。\n * 候选:原样绝对路径 / mediaBaseDir 下相对路径(反斜杠归一化)。\n */\nexport function resolveLocalMediaFile(\n relPath: string,\n deps: { mediaBaseDir?: string | undefined },\n): string | null {\n if (relPath === \"\") {\n return null;\n }\n if (existsSync(relPath)) {\n return relPath;\n }\n const base = deps.mediaBaseDir;\n if (base !== undefined && base !== \"\") {\n const joined = join(base, relPath.replaceAll(\"\\\\\", \"/\"));\n if (existsSync(joined)) {\n return joined;\n }\n }\n return null;\n}\n\n/** 图片主动下载(picUrl → cacheDir/media/<uuid>.<ext>;无 cacheDir/url 返回 null)。 */\nasync function downloadImageToCache(\n url: string,\n deps: Pick<GetMediaDeps, \"cacheDir\">,\n): Promise<string | null> {\n const cacheDir = deps.cacheDir;\n if (cacheDir === undefined || cacheDir === \"\") {\n return null;\n }\n const mediaDir = join(cacheDir, \"media\");\n const { mkdir } = await import(\"node:fs/promises\");\n await mkdir(mediaDir, { recursive: true });\n const dest = join(mediaDir, `${randomUUID()}${inferExtension(null, url)}`);\n try {\n await downloadUrl(url, dest);\n return dest;\n } catch {\n return null;\n }\n}\n\n/**\n * 反查消息并提取媒体元素路径。\n * 返回 null = 消息不存在;extract 返回 undefined = 无匹配元素。\n */\nasync function resolveMedia(\n id: number | string,\n label: string,\n deps: GetMediaDeps,\n extract: (element: RawElement) => MediaInfoResult | undefined,\n): Promise<MediaInfoResult> {\n const { msgId, peer } = resolveMsgIdAndPeer(id, deps.messageUnique);\n const msgs = await deps.msgApi.fetchMsgsByMsgId(peer, [msgId]);\n const [first] = msgs;\n if (first === undefined) {\n throw kernelError(`消息 ${id} 不存在或已被撤回`, \"NOT_FOUND\");\n }\n for (const el of first.elements) {\n const found = extract(el);\n if (found !== undefined) {\n return found;\n }\n }\n throw kernelError(`消息 ${id} 不包含${label}`, \"NOT_FOUND\");\n}\n\n/** 取 id 参数(message_id 优先,file 兜底)。 */\nfunction takeId(payload: GetMediaPayload, actionName: string): number | string {\n const id = payload.message_id ?? payload.file;\n if (id === undefined) {\n throw kernelError(`${actionName} 需要 message_id 或 file`, \"INVALID_PARAM\");\n }\n return id;\n}\n\n/** 获取图片信息(本地优先,picUrl 主动下载兜底)。 */\nexport class GetImageAction extends BaseAction<GetMediaPayload, MediaInfoResult> {\n readonly name = \"get_image\";\n readonly schema = getMediaSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: GetMediaDeps;\n\n constructor(deps: GetMediaDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetMediaPayload): Promise<MediaInfoResult> {\n const id = takeId(payload, \"get_image\");\n const base = await resolveMedia(id, \"图片\", this.deps, (el) => {\n const pic = el.picElement;\n if (pic === undefined) {\n return undefined;\n }\n const out: MediaInfoResult = {};\n if (pic.fileSize !== undefined) {\n out.file_size = pic.fileSize;\n }\n if (pic.fileName !== undefined) {\n out.file_name = pic.fileName;\n }\n if (pic.picUrl !== undefined) {\n out.url = pic.picUrl;\n }\n const rel = pic.sourcePath ?? pic.picPath;\n if (rel !== undefined) {\n const local = resolveLocalMediaFile(rel, this.deps);\n if (local !== null) {\n out.file = local;\n }\n }\n return out;\n });\n // 本地未命中且有 URL → 主动下载到缓存目录\n if (base.file === undefined && base.url !== undefined) {\n const downloaded = await downloadImageToCache(base.url, this.deps);\n if (downloaded !== null) {\n base.file = downloaded;\n }\n }\n return base;\n }\n}\n\n/** 获取语音信息(本地优先;未命中走原生 downloadRichMedia,失败回退原始路径)。 */\nexport class GetRecordAction extends BaseAction<GetMediaPayload, MediaInfoResult> {\n readonly name = \"get_record\";\n readonly schema = getMediaSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: GetMediaDeps;\n\n constructor(deps: GetMediaDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetMediaPayload): Promise<MediaInfoResult> {\n const id = takeId(payload, \"get_record\");\n const { msgId, peer } = resolveMsgIdAndPeer(id, this.deps.messageUnique);\n const msgs = await this.deps.msgApi.fetchMsgsByMsgId(peer, [msgId]);\n const [first] = msgs;\n if (first === undefined) {\n throw kernelError(`消息 ${id} 不存在或已被撤回`, \"NOT_FOUND\");\n }\n const el = first.elements.find((e) => e.pttElement !== undefined);\n const ptt = el?.pttElement;\n if (ptt === undefined || ptt.filePath === undefined) {\n throw kernelError(`消息 ${id} 不包含语音`, \"NOT_FOUND\");\n }\n const meta = (): MediaInfoResult => ({\n ...(ptt.fileSize !== undefined ? { file_size: ptt.fileSize } : {}),\n ...(ptt.fileName !== undefined ? { file_name: ptt.fileName } : {}),\n });\n const local = resolveLocalMediaFile(ptt.filePath, this.deps);\n if (local !== null) {\n return { ...meta(), file: local };\n }\n // 本地未命中 → 原生下载(downloadRichMedia + 元素回查;失败回退原始路径)\n try {\n const downloaded = await this.deps.msgApi.downloadPtt(msgId, peer);\n const rel = downloaded.filePath;\n if (rel !== undefined && rel !== \"\") {\n const localAfter = resolveLocalMediaFile(rel, this.deps);\n if (localAfter !== null) {\n return {\n ...(downloaded.fileSize !== undefined\n ? { file_size: downloaded.fileSize }\n : {}),\n ...(downloaded.fileName !== undefined\n ? { file_name: downloaded.fileName }\n : {}),\n file: localAfter,\n };\n }\n }\n } catch {\n // 下载失败:回退现状(原始路径 + 元数据,不抛错)\n }\n return { ...meta(), file: ptt.filePath };\n }\n}\n","/**\n * get_msg 动作:获取消息详情(P2-10 接 kernel MsgApi.fetchMsgsByMsgId)\n *\n * message_id → msgId + peer(MessageUnique 反查)→ 拉消息 → OB11 消息信息结构。\n */\n\nimport { ChatType, toCanonicalElements } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport {\n collectReceiveNeeds,\n type ReceiveTranslateContext,\n toOb11MessageInfo,\n} from \"../../helper/index.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { fetchMsgById } from \"./resolve-peer.js\";\n\nconst getMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\ntype GetMsgPayload = z.infer<typeof getMsgSchema>;\n\n/** get_msg 依赖(OneBotApi 视图,由装配方注入)。 */\nexport type GetMsgDeps = Pick<\n OneBotApi,\n \"msgApi\" | \"messageUnique\" | \"uidToUin\" | \"groupMemberRole\"\n>;\n\n/** 获取消息详情(P2-10 接 kernel fetchMsgsByMsgId)。 */\nexport class GetMsgAction extends BaseAction<GetMsgPayload, OB11MessageInfo> {\n readonly name = \"get_msg\";\n readonly schema = getMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: GetMsgDeps;\n\n constructor(deps: GetMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetMsgPayload): Promise<OB11MessageInfo> {\n const { msg } = await fetchMsgById(\n payload.message_id,\n this.deps.messageUnique,\n this.deps.msgApi,\n );\n // P2-19:收集 at uid → 批量 uidToUin → 上下文注入(at uid→uin、reply 映射)\n const elements = toCanonicalElements(msg);\n const { atUids } = collectReceiveNeeds(elements);\n let uidToUin: Map<string, string> | undefined;\n if (atUids.length > 0) {\n try {\n uidToUin = await this.deps.uidToUin(atUids);\n } catch {\n // uid 解析失败:at 原样(uid)\n }\n }\n // 群消息查发送者角色(GroupCache 缓存优先;失败回退缺省 member)\n const senderRole =\n msg.chatType === ChatType.GROUP\n ? await this.deps.groupMemberRole(msg.peerUid, msg.senderUid)\n : undefined;\n const ctx: ReceiveTranslateContext = {\n ...(uidToUin !== undefined ? { uidToUin } : {}),\n ...(senderRole !== undefined ? { senderRole } : {}),\n msgIdToOb11Id: (m) => this.deps.messageUnique.getMessageId(m),\n };\n return toOb11MessageInfo(msg, this.deps.messageUnique, ctx);\n }\n}\n","/**\n * mark_msg_as_read 动作:标记消息已读(P2-10 接 kernel MsgApi.markRead)\n *\n * OB11 标准 mark_msg_as_read 以 user_id 为参数;NapCat 扩展同时支持 group_id\n * (mark_private_msg_as_read / mark_group_msg_as_read 由 adapter 层同名动作或\n * 语义别名处理)。user_id → C2C peer;group_id → GROUP peer。\n */\n\nimport { ChatType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst markMsgAsReadSchema = z\n .object({\n user_id: z.number().optional(),\n group_id: z.number().optional(),\n })\n .refine((v) => v.user_id !== undefined || v.group_id !== undefined, {\n message: \"mark_msg_as_read 需要 user_id 或 group_id\",\n });\n\ntype MarkMsgAsReadPayload = z.infer<typeof markMsgAsReadSchema>;\n\n/** 标记已读依赖(OneBotApi 视图,由装配方注入)。 */\nexport type MarkReadDeps = Pick<OneBotApi, \"msgApi\" | \"uinToUid\">;\n\n/** 标记消息已读(P2-10 接 kernel markRead)。 */\nexport class MarkMsgAsReadAction extends BaseAction<MarkMsgAsReadPayload, null> {\n readonly name = \"mark_msg_as_read\";\n readonly schema = markMsgAsReadSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: MarkReadDeps;\n\n constructor(deps: MarkReadDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: MarkMsgAsReadPayload): Promise<null> {\n if (payload.group_id !== undefined) {\n await this.deps.msgApi.markRead({\n chatType: ChatType.GROUP,\n peerUid: String(payload.group_id),\n });\n return null;\n }\n if (payload.user_id !== undefined) {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n await this.deps.msgApi.markRead({ chatType: ChatType.C2C, peerUid: uid });\n }\n return null;\n }\n}\n","/**\n * mark_private_msg_as_read / mark_group_msg_as_read 动作:标记会话已读(P2-13)\n *\n * mark_msg_as_read 的细分别名(NapCat 扩展):\n * - mark_private_msg_as_read:user_id → C2C markRead\n * - mark_group_msg_as_read:group_id → GROUP markRead\n */\n\nimport { ChatType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst markPrivateMsgAsReadSchema = z.object({\n user_id: z.number(),\n});\n\ntype MarkPrivateMsgAsReadPayload = z.infer<typeof markPrivateMsgAsReadSchema>;\n\nconst markGroupMsgAsReadSchema = z.object({\n group_id: z.number(),\n});\n\ntype MarkGroupMsgAsReadPayload = z.infer<typeof markGroupMsgAsReadSchema>;\n\n/** 标记已读依赖(msgApi + uinToUid,OneBotApi 视图)。 */\nexport type MarkReadAliasDeps = Pick<OneBotApi, \"msgApi\" | \"uinToUid\">;\n\n/** 标记私聊已读(P2-13)。 */\nexport class MarkPrivateMsgAsReadAction extends BaseAction<MarkPrivateMsgAsReadPayload, null> {\n readonly name = \"mark_private_msg_as_read\";\n readonly schema = markPrivateMsgAsReadSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: MarkReadAliasDeps;\n\n constructor(deps: MarkReadAliasDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: MarkPrivateMsgAsReadPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n await this.deps.msgApi.markRead({ chatType: ChatType.C2C, peerUid: uid });\n return null;\n }\n}\n\n/** 标记群聊已读(P2-13)。 */\nexport class MarkGroupMsgAsReadAction extends BaseAction<MarkGroupMsgAsReadPayload, null> {\n readonly name = \"mark_group_msg_as_read\";\n readonly schema = markGroupMsgAsReadSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"msgApi\">;\n\n constructor(deps: Pick<OneBotApi, \"msgApi\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: MarkGroupMsgAsReadPayload): Promise<null> {\n await this.deps.msgApi.markRead({\n chatType: ChatType.GROUP,\n peerUid: String(payload.group_id),\n });\n return null;\n }\n}\n","/**\n * send_group_forward_msg / send_private_forward_msg 动作:发送合并转发(P2-12)\n *\n * messages 每项为 node 元素 `{ type: \"node\", data: { id } }`——id 是此前\n * send_msg 返回的 OB11 message_id。经 MessageUnique 反查源 msgId + peer,\n * 组装到目标 peer(群直通 / 私聊 uinToUid)→ MsgApi.sendForwardMessage。\n */\n\nimport { ChatType, kernelError, type Peer } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport type { MessageUnique } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst forwardNodeSchema = z.object({\n type: z.literal(\"node\").optional(),\n data: z\n .object({\n id: z.union([z.number(), z.string()]),\n })\n .optional(),\n});\n\nconst sendGroupForwardMsgSchema = z.object({\n group_id: z.number(),\n messages: z.array(z.unknown()).default([]),\n});\n\ntype SendGroupForwardMsgPayload = z.infer<typeof sendGroupForwardMsgSchema>;\n\nconst sendPrivateForwardMsgSchema = z.object({\n user_id: z.number(),\n messages: z.array(z.unknown()).default([]),\n});\n\ntype SendPrivateForwardMsgPayload = z.infer<typeof sendPrivateForwardMsgSchema>;\n\n/** 合并转发依赖(OneBotApi 视图,由装配方注入)。 */\nexport type ForwardMsgDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\" | \"uinToUid\">;\n\n/** 解析 node 元素列表 → 源消息 (msgId, peer) 列表(id 反查,跳过无法解析的项)。 */\nfunction resolveSourceMessages(\n messages: unknown[],\n unique: MessageUnique,\n): Array<{ msgId: string; peer: Peer }> {\n const out: Array<{ msgId: string; peer: Peer }> = [];\n for (const raw of messages) {\n const parsed = forwardNodeSchema.safeParse(raw);\n if (parsed.success) {\n const id = parsed.data.data?.id;\n if (id !== undefined) {\n const msgId = unique.getMsgId(Number(id));\n if (msgId !== undefined) {\n const peer = unique.getPeer(msgId);\n if (peer !== undefined) {\n out.push({ msgId, peer });\n }\n }\n }\n }\n }\n return out;\n}\n\n/** 合并转发发送(群/私聊共用:解析源消息 → 发送 → 映射 message_id)。 */\nasync function sendForward(\n messages: unknown[],\n target: Peer,\n deps: ForwardMsgDeps,\n): Promise<{ message_id: number }> {\n const sources = resolveSourceMessages(messages, deps.messageUnique);\n const [firstSource] = sources;\n if (firstSource === undefined) {\n throw kernelError(\"合并转发需要至少一条可解析的源消息(node.id)\", \"INVALID_PARAM\");\n }\n const { msgId } = await deps.msgApi.sendForwardMessage(\n target,\n firstSource.peer,\n sources.map((s) => s.msgId),\n );\n return { message_id: deps.messageUnique.alloc(msgId, target) };\n}\n\n/** 发送群合并转发(P2-12 接 kernel sendForwardMessage)。 */\nexport class SendGroupForwardMsgAction extends BaseAction<\n SendGroupForwardMsgPayload,\n { message_id: number }\n> {\n readonly name = \"send_group_forward_msg\";\n readonly schema = sendGroupForwardMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: ForwardMsgDeps;\n\n constructor(deps: ForwardMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SendGroupForwardMsgPayload): Promise<{ message_id: number }> {\n const target: Peer = { chatType: ChatType.GROUP, peerUid: String(payload.group_id) };\n return await sendForward(payload.messages, target, this.deps);\n }\n}\n\n/** 发送私聊合并转发(P2-12)。 */\nexport class SendPrivateForwardMsgAction extends BaseAction<\n SendPrivateForwardMsgPayload,\n { message_id: number }\n> {\n readonly name = \"send_private_forward_msg\";\n readonly schema = sendPrivateForwardMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: ForwardMsgDeps;\n\n constructor(deps: ForwardMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(\n payload: SendPrivateForwardMsgPayload,\n ): Promise<{ message_id: number }> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n const target: Peer = { chatType: ChatType.C2C, peerUid: uid };\n return await sendForward(payload.messages, target, this.deps);\n }\n}\n","/**\n * send_msg 动作:发送消息(群聊/私聊)+ 共享发送核心 sendOb11Message\n *\n * P2-3 真实化:注入 kernel MsgApi,message 参数(CQ 码字符串或 segment 数组)\n * 翻译为 canonical 元素 → MsgApi.sendMessage → 返回真实 message_id。\n * send_private_msg / send_group_msg 复用 sendOb11Message(P2-10)。\n *\n * 群聊:group_id → Peer{ chatType: GROUP, peerUid: String(group_id) }(群消息 peerUid=群号)。\n * 私聊:user_id 经 uin→uid → Peer{ chatType: C2C, peerUid: uid }。\n */\n\nimport type { CanonicalElement } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction, ensureSilk } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { applySendContext, cqMessageToCanonical, segmentsToCanonical } from \"../../helper/index.js\";\nimport type { OB11MessageSegment } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveTargetPeer } from \"./resolve-peer.js\";\n\nconst sendMsgSchema = z.object({\n message_type: z.enum([\"group\", \"private\"]).optional(),\n user_id: z.number().optional(),\n group_id: z.number().optional(),\n message: z.union([z.string(), z.array(z.unknown())]),\n auto_escape: z.boolean().optional(),\n});\n\nexport type SendMsgPayload = z.infer<typeof sendMsgSchema>;\n\n/** send_msg 依赖(OneBotApi 视图,由装配方注入)。 */\nexport type SendMsgDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\" | \"uinToUid\">;\n\n/** 共享发送核心:解析 Peer → canonical 翻译(含 auto_escape)→ sendMessage → 映射 message_id。 */\nexport async function sendOb11Message(\n payload: SendMsgPayload,\n deps: SendMsgDeps,\n): Promise<{ message_id: number }> {\n const peer = await resolveTargetPeer(payload, deps, \"send_msg 需要 group_id 或 user_id\");\n // message: CQ 码字符串 → canonical;segment 数组 → canonical\n let canonical: CanonicalElement[];\n if (Array.isArray(payload.message)) {\n canonical = segmentsToCanonical(payload.message as OB11MessageSegment[]);\n } else {\n canonical = cqMessageToCanonical(payload.message);\n }\n // P2-19 发送方向 ID 转换:at.qq 是 uin → uid(一次批量 uinToUid);\n // reply.id 是 OB11 message_id → NT msgId(MessageUnique 反查,反查不到原样透传)\n const atUins: string[] = [];\n for (const el of canonical) {\n if (el.type === \"at\" && el.target !== \"all\") {\n atUins.push(el.target);\n }\n }\n let uinToUid: Map<string, string> | undefined;\n if (atUins.length > 0) {\n try {\n uinToUid = await deps.uinToUid(atUins);\n } catch {\n // uin 解析失败:at 原样(uin),交给 QQ 端判断\n }\n }\n canonical = applySendContext(canonical, {\n ...(uinToUid !== undefined ? { uinToUid } : {}),\n ob11IdToMsgId: (id) => deps.messageUnique.getMsgId(id),\n });\n // auto_escape:文本段转义 CQ 特殊字符\n if (payload.auto_escape === true) {\n canonical = canonical.map((el) => {\n if (el.type === \"text\") {\n return { ...el, text: escapeText(el.text) };\n }\n return el;\n });\n }\n // 语音段:非 silk 输入转 silk(QQ 语音协议);转换在协议层完成,kernel 不背 media(红线)\n canonical = await ensureVoiceSilk(canonical);\n const { msgId } = await deps.msgApi.sendMessage(peer, canonical);\n return { message_id: deps.messageUnique.alloc(msgId, peer) };\n}\n\n/** 发送消息(P2-3 接 kernel apis/msg,返回真实 message_id)。 */\nexport class SendMsgAction extends BaseAction<SendMsgPayload, { message_id: number }> {\n readonly name = \"send_msg\";\n readonly schema = sendMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SendMsgDeps;\n\n constructor(deps: SendMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected _handle(payload: SendMsgPayload): Promise<{ message_id: number }> {\n return sendOb11Message(payload, this.deps);\n }\n}\n\n/** CQ 特殊字符转义(auto_escape,&、[、]、, 前置 &amp;)。 */\nfunction escapeText(text: string): string {\n return text\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"[\", \"&#91;\")\n .replaceAll(\"]\", \"&#93;\")\n .replaceAll(\",\", \"&#44;\");\n}\n\n/** 语音元素统一转 silk:非 silk 自动转码(QQ 语音格式),已是 silk 原样。 */\nasync function ensureVoiceSilk(elements: CanonicalElement[]): Promise<CanonicalElement[]> {\n const out: CanonicalElement[] = [];\n for (const el of elements) {\n if (el.type === \"voice\") {\n out.push({ ...el, path: await ensureSilk(el.path) });\n } else {\n out.push(el);\n }\n }\n return out;\n}\n","/**\n * send_group_msg 动作:发送群聊消息(复用 sendOb11Message 核心)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport type { SendMsgDeps } from \"./send-msg.js\";\nimport { sendOb11Message } from \"./send-msg.js\";\n\nconst sendGroupMsgSchema = z.object({\n group_id: z.number(),\n message: z.union([z.string(), z.array(z.unknown())]),\n auto_escape: z.boolean().optional(),\n});\n\ntype SendGroupMsgPayload = z.infer<typeof sendGroupMsgSchema>;\n\n/** 发送群聊消息(P2-10 复用 sendOb11Message)。 */\nexport class SendGroupMsgAction extends BaseAction<SendGroupMsgPayload, { message_id: number }> {\n readonly name = \"send_group_msg\";\n readonly schema = sendGroupMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SendMsgDeps;\n\n constructor(deps: SendMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected _handle(payload: SendGroupMsgPayload): Promise<{ message_id: number }> {\n return sendOb11Message(payload, this.deps);\n }\n}\n","/**\n * send_private_msg 动作:发送私聊消息(复用 sendOb11Message 核心)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport type { SendMsgDeps } from \"./send-msg.js\";\nimport { sendOb11Message } from \"./send-msg.js\";\n\nconst sendPrivateMsgSchema = z.object({\n user_id: z.number(),\n message: z.union([z.string(), z.array(z.unknown())]),\n auto_escape: z.boolean().optional(),\n});\n\ntype SendPrivateMsgPayload = z.infer<typeof sendPrivateMsgSchema>;\n\n/** 发送私聊消息(P2-10 复用 sendOb11Message)。 */\nexport class SendPrivateMsgAction extends BaseAction<\n SendPrivateMsgPayload,\n { message_id: number }\n> {\n readonly name = \"send_private_msg\";\n readonly schema = sendPrivateMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SendMsgDeps;\n\n constructor(deps: SendMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected _handle(payload: SendPrivateMsgPayload): Promise<{ message_id: number }> {\n return sendOb11Message(payload, this.deps);\n }\n}\n","/**\n * set_input_status 动作:发送输入状态(NapCat 扩展,P2-11)\n *\n * user_id → uinToUid → MsgApi.setInputStatus(peer, eventType)。\n * eventType:1=输入中,0=停止输入。\n */\n\nimport { ChatType } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { resolveUid } from \"../resolve-uid.js\";\n\nconst setInputStatusSchema = z.object({\n user_id: z.number(),\n /** 输入事件类型:1=输入中,0=停止。 */\n event_type: z.number().optional(),\n});\n\ntype SetInputStatusPayload = z.infer<typeof setInputStatusSchema>;\n\n/** 输入中事件类型。 */\nconst EVENT_TYPE_TYPING = 1;\n\n/** set_input_status 依赖(OneBotApi 视图)。 */\nexport type SetInputStatusDeps = Pick<OneBotApi, \"msgApi\" | \"uinToUid\">;\n\n/** 发送输入状态(P2-11 接 kernel setInputStatus)。 */\nexport class SetInputStatusAction extends BaseAction<SetInputStatusPayload, null> {\n readonly name = \"set_input_status\";\n readonly schema = setInputStatusSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SetInputStatusDeps;\n\n constructor(deps: SetInputStatusDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SetInputStatusPayload): Promise<null> {\n const uid = await resolveUid(String(payload.user_id), this.deps.uinToUid);\n await this.deps.msgApi.setInputStatus(\n { chatType: ChatType.C2C, peerUid: uid },\n payload.event_type ?? EVENT_TYPE_TYPING,\n );\n return null;\n }\n}\n","/**\n * set_msg_emoji_like 动作:消息表情表态(NapCat 扩展,P2-10)\n *\n * message_id → msgId + peer → 拉消息取 msgSeq → MsgApi.setMsgEmojiLike。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport { fetchMsgById } from \"./resolve-peer.js\";\n\nconst setMsgEmojiLikeSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n /** 表情 ID(如 105 点赞)。 */\n emoji_id: z.number(),\n /** 表情类型(默认 1)。 */\n emoji_type: z.number().optional(),\n /** 是否点赞(false 取消)。 */\n like: z.boolean().optional(),\n});\n\ntype SetMsgEmojiLikePayload = z.infer<typeof setMsgEmojiLikeSchema>;\n\n/** 表情表态依赖(OneBotApi 视图,由装配方注入)。 */\nexport type SetMsgEmojiLikeDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\">;\n\n/** 消息表情表态(P2-10 接 kernel setMsgEmojiLike)。 */\nexport class SetMsgEmojiLikeAction extends BaseAction<SetMsgEmojiLikePayload, null> {\n readonly name = \"set_msg_emoji_like\";\n readonly schema = setMsgEmojiLikeSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SetMsgEmojiLikeDeps;\n\n constructor(deps: SetMsgEmojiLikeDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SetMsgEmojiLikePayload): Promise<null> {\n const { msg, peer } = await fetchMsgById(\n payload.message_id,\n this.deps.messageUnique,\n this.deps.msgApi,\n );\n await this.deps.msgApi.setMsgEmojiLike(peer, {\n msgSeq: msg.msgSeq,\n emojiId: String(payload.emoji_id),\n emojiType: String(payload.emoji_type ?? 1),\n like: payload.like ?? true,\n });\n return null;\n }\n}\n","/**\n * can_send_image 动作:是否可以发送图片(本地 true,P2-11)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst canSendImageSchema = z.object({});\n\ntype CanSendImagePayload = z.infer<typeof canSendImageSchema>;\n\n/** 是否可以发送图片(本地 true,P2-11)。 */\nexport class CanSendImageAction extends BaseAction<CanSendImagePayload, { yes: boolean }> {\n readonly name = \"can_send_image\";\n readonly schema = canSendImageSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n protected _handle(_payload: CanSendImagePayload): Promise<{ yes: boolean }> {\n return Promise.resolve({ yes: true });\n }\n}\n","/**\n * can_send_record 动作:是否可以发送语音(本地 true,P2-11)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst canSendRecordSchema = z.object({});\n\ntype CanSendRecordPayload = z.infer<typeof canSendRecordSchema>;\n\n/** 是否可以发送语音(本地 true,P2-11)。 */\nexport class CanSendRecordAction extends BaseAction<CanSendRecordPayload, { yes: boolean }> {\n readonly name = \"can_send_record\";\n readonly schema = canSendRecordSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n protected _handle(_payload: CanSendRecordPayload): Promise<{ yes: boolean }> {\n return Promise.resolve({ yes: true });\n }\n}\n","/**\n * clean_cache 动作:清理缓存(本地组装,P2-11)\n *\n * cleanCache 回调由装配方注入(boot.cjs 接 kernel PathWrapper.clearCache)。\n * 未配置时明确报错(不静默)。\n */\n\nimport { kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst cleanCacheSchema = z.object({});\n\ntype CleanCachePayload = z.infer<typeof cleanCacheSchema>;\n\n/** clean_cache 依赖(cleanCache 回调由装配方注入,OneBotApi 视图)。 */\nexport type CleanCacheDeps = Pick<OneBotApi, \"cleanCache\">;\n\n/** 清理缓存(P2-11)。 */\nexport class CleanCacheAction extends BaseAction<CleanCachePayload, null> {\n readonly name = \"clean_cache\";\n readonly schema = cleanCacheSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: CleanCacheDeps;\n\n constructor(deps: CleanCacheDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(_payload: CleanCachePayload): Promise<null> {\n if (this.deps.cleanCache === undefined) {\n throw kernelError(\"clean_cache 未配置(装配方未注入清理回调)\", \"INVALID_STATE\");\n }\n await this.deps.cleanCache();\n return null;\n }\n}\n","/**\n * download_file 动作:下载文件到缓存目录(P2-12)\n *\n * url → fetch 下载 → 存 deps.system.cacheDir(缺省抛错)→ 返回 { file }。\n * 文件名:download-<timestamp>-<basename>(headers 等扩展字段忽略)。\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst downloadFileSchema = z.object({\n url: z.string(),\n thread_count: z.number().optional(),\n headers: z.record(z.string(), z.string()).optional(),\n});\n\ntype DownloadFilePayload = z.infer<typeof downloadFileSchema>;\n\n/** download_file 依赖(cacheDir 由装配方注入,OneBotApi 视图)。 */\nexport type DownloadFileDeps = Pick<OneBotApi, \"cacheDir\">;\n\n/** 下载文件到缓存目录(P2-12)。 */\nexport class DownloadFileAction extends BaseAction<DownloadFilePayload, { file: string }> {\n readonly name = \"download_file\";\n readonly schema = downloadFileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: DownloadFileDeps;\n\n constructor(deps: DownloadFileDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: DownloadFilePayload): Promise<{ file: string }> {\n const { cacheDir } = this.deps;\n if (cacheDir === undefined || cacheDir === \"\") {\n throw kernelError(\"download_file 未配置缓存目录(装配方未注入)\", \"INVALID_STATE\");\n }\n const safeName = basename(new URL(payload.url).pathname) || \"download.bin\";\n const filePath = join(cacheDir, `download-${Date.now()}-${safeName}`);\n mkdirSync(cacheDir, { recursive: true });\n const init: RequestInit = {};\n if (payload.headers !== undefined) {\n init.headers = payload.headers;\n }\n const res = await fetch(payload.url, init);\n if (!res.ok) {\n throw new Error(`下载失败: ${res.status} ${res.statusText}`);\n }\n const buf = new Uint8Array(await res.arrayBuffer());\n writeFileSync(filePath, buf);\n return { file: filePath };\n }\n}\n","/**\n * get_clientkey 动作:获取 clientKey(P2-13 接 kernel TicketApi.getClientKey)\n */\n\nimport type { TicketApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getClientkeySchema = z.object({});\n\ntype GetClientkeyPayload = z.infer<typeof getClientkeySchema>;\n\n/** 获取 clientKey(P2-13 接 kernel TicketApi)。 */\nexport class GetClientkeyAction extends BaseAction<\n GetClientkeyPayload,\n { clientKey: string; keyIndex: string; expireTime: string; url: string }\n> {\n readonly name = \"get_clientkey\";\n readonly schema = getClientkeySchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly ticketApi: TicketApi;\n\n constructor(ticketApi: TicketApi) {\n super();\n this.ticketApi = ticketApi;\n }\n\n protected async _handle(_payload: GetClientkeyPayload): Promise<{\n clientKey: string;\n keyIndex: string;\n expireTime: string;\n url: string;\n }> {\n const raw = await this.ticketApi.getClientKey();\n return {\n clientKey: raw.clientKey,\n keyIndex: raw.keyIndex,\n expireTime: raw.expireTime,\n url: raw.url,\n };\n }\n}\n","/**\n * get_cookies 动作:获取 cookies(P2-13 接 kernel TicketApi.getCookies)\n *\n * domain 缺省 v2.qq.com(NapCat 行为);user_id 缺省用机器人自身 uin。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getCookiesSchema = z.object({\n domain: z.string().optional(),\n user_id: z.number().optional(),\n});\n\ntype GetCookiesPayload = z.infer<typeof getCookiesSchema>;\n\n/** 默认域名。 */\nconst DEFAULT_DOMAIN = \"v2.qq.com\";\n\n/** 获取 cookies(P2-13 接 kernel TicketApi.getCookies)。 */\nexport class GetCookiesAction extends BaseAction<GetCookiesPayload, Record<string, string>> {\n readonly name = \"get_cookies\";\n readonly schema = getCookiesSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">;\n\n constructor(deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">) {\n super();\n this.deps = deps;\n }\n\n protected _handle(payload: GetCookiesPayload): Promise<Record<string, string>> {\n const domain = payload.domain ?? DEFAULT_DOMAIN;\n let uin = this.deps.selfUin;\n if (payload.user_id !== undefined) {\n uin = String(payload.user_id);\n }\n return this.deps.ticketApi.getCookies(domain, uin);\n }\n}\n","/**\n * get_csrf_token / get_credentials 动作(P2-15 接 kernel TicketApi)\n *\n * - get_csrf_token:qun.qq.com cookies 的 skey → bkn(csrf 等价物)\n * - get_credentials:指定域名 cookies + bkn → { cookies, csrf_token }\n */\nimport { TicketApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getCsrfTokenSchema = z.object({});\n\ntype GetCsrfTokenPayload = z.infer<typeof getCsrfTokenSchema>;\n\n/** 默认域名(bkn 计算用)。 */\nconst DEFAULT_DOMAIN = \"qun.qq.com\";\n\n/** 获取 csrf_token(bkn,P2-15)。 */\nexport class GetCsrfTokenAction extends BaseAction<GetCsrfTokenPayload, { token: number }> {\n readonly name = \"get_csrf_token\";\n readonly schema = getCsrfTokenSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">;\n\n constructor(deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(_payload: GetCsrfTokenPayload): Promise<{ token: number }> {\n const cookies = await this.deps.ticketApi.getCookies(DEFAULT_DOMAIN, this.deps.selfUin);\n const skey = cookies[\"skey\"] ?? \"\";\n return { token: Number(TicketApi.getBkn(skey)) };\n }\n}\n\nconst getCredentialsSchema = z.object({\n domain: z.string().optional(),\n});\n\ntype GetCredentialsPayload = z.infer<typeof getCredentialsSchema>;\n\n/** 获取凭据(cookies + csrf_token,P2-15)。 */\nexport class GetCredentialsAction extends BaseAction<\n GetCredentialsPayload,\n { cookies: Record<string, string>; csrf_token: number }\n> {\n readonly name = \"get_credentials\";\n readonly schema = getCredentialsSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">;\n\n constructor(deps: Pick<OneBotApi, \"ticketApi\" | \"selfUin\">) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: GetCredentialsPayload): Promise<{\n cookies: Record<string, string>;\n csrf_token: number;\n }> {\n const domain = payload.domain ?? DEFAULT_DOMAIN;\n const cookies = await this.deps.ticketApi.getCookies(domain, this.deps.selfUin);\n return {\n cookies,\n csrf_token: Number(TicketApi.getBkn(cookies[\"skey\"] ?? \"\")),\n };\n }\n}\n","/**\n * get_login_info 动作:获取登录信息(P2-4 注入 self)\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { LoginInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getLoginInfoSchema = z.object({});\n\ntype GetLoginInfoPayload = z.infer<typeof getLoginInfoSchema>;\n\n/** 获取登录信息(self 由装配方注入,P2-5 接 kernel selfInfo 维护后取真实昵称)。 */\nexport class GetLoginInfoAction extends BaseAction<GetLoginInfoPayload, LoginInfo> {\n readonly name = \"get_login_info\";\n readonly schema = getLoginInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly self: { uin: string; nickname: string };\n\n constructor(self: { uin: string; nickname: string }) {\n super();\n this.self = self;\n }\n\n protected _handle(_payload: GetLoginInfoPayload): Promise<LoginInfo> {\n return Promise.resolve({\n user_id: Number(this.self.uin),\n nickname: this.self.nickname,\n });\n }\n}\n","/**\n * get_robot_uin_range 动作:获取机器人 QQ 号范围(本地组装,P2-11)\n *\n * NapCat 从配置返回;我们给通用范围(min/max)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getRobotUinRangeSchema = z.object({});\n\ntype GetRobotUinRangePayload = z.infer<typeof getRobotUinRangeSchema>;\n\n/** QQ 号下限。 */\nconst UIN_MIN = 10_001;\n/** QQ 号上限。 */\nconst UIN_MAX = 4_294_967_295;\n\n/** 获取机器人 QQ 号范围(P2-11 本地组装)。 */\nexport class GetRobotUinRangeAction extends BaseAction<\n GetRobotUinRangePayload,\n { min: number; max: number }\n> {\n readonly name = \"get_robot_uin_range\";\n readonly schema = getRobotUinRangeSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n protected _handle(_payload: GetRobotUinRangePayload): Promise<{ min: number; max: number }> {\n return Promise.resolve({ min: UIN_MIN, max: UIN_MAX });\n }\n}\n","/**\n * get_status 动作:获取运行状态(本地组装,P2-11)\n *\n * 返回与心跳 status 同构的 OB11Status(online/good + 扩展字段)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OB11Status } from \"../../event/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getStatusSchema = z.object({});\n\ntype GetStatusPayload = z.infer<typeof getStatusSchema>;\n\n/** 获取运行状态(本地组装,P2-11)。 */\nexport class GetStatusAction extends BaseAction<GetStatusPayload, OB11Status> {\n readonly name = \"get_status\";\n readonly schema = getStatusSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n protected _handle(_payload: GetStatusPayload): Promise<OB11Status> {\n return Promise.resolve({\n online: true,\n good: true,\n });\n }\n}\n","/**\n * get_version_info 动作:获取版本信息(本地组装,P2-11)\n *\n * appVersion 由装配方注入(kernel wrapper 版本或 NAPUTO_QQ_VERSION)。\n */\n\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport type { VersionInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst getVersionInfoSchema = z.object({});\n\ntype GetVersionInfoPayload = z.infer<typeof getVersionInfoSchema>;\n\n/** get_version_info 依赖(appVersion 由装配方注入,OneBotApi 视图)。 */\nexport type GetVersionInfoDeps = Pick<OneBotApi, \"appVersion\">;\n\n/** 获取版本信息(本地组装,P2-11)。 */\nexport class GetVersionInfoAction extends BaseAction<GetVersionInfoPayload, VersionInfo> {\n readonly name = \"get_version_info\";\n readonly schema = getVersionInfoSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: GetVersionInfoDeps;\n\n constructor(deps: GetVersionInfoDeps) {\n super();\n this.deps = deps;\n }\n\n protected _handle(_payload: GetVersionInfoPayload): Promise<VersionInfo> {\n return Promise.resolve({\n app_name: \"napuketto-qq\",\n app_version: this.deps.appVersion,\n protocol_version: \"v11\",\n });\n }\n}\n","/**\n * bot_exit / set_restart 动作:退出 / 重启(P2-12)\n *\n * exit/restart 回调由装配方注入(boot.cjs 接进程控制)。未配置时明确报错。\n */\n\nimport { kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst botExitSchema = z.object({});\n\ntype BotExitPayload = z.infer<typeof botExitSchema>;\n\n/** 退出/重启依赖(回调由装配方注入,OneBotApi 视图)。 */\nexport type ProcessControlDeps = Pick<OneBotApi, \"exit\" | \"restart\">;\n\n/** 退出机器人进程(P2-12)。 */\nexport class BotExitAction extends BaseAction<BotExitPayload, null> {\n readonly name = \"bot_exit\";\n readonly schema = botExitSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: ProcessControlDeps;\n\n constructor(deps: ProcessControlDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(_payload: BotExitPayload): Promise<null> {\n if (this.deps.exit === undefined) {\n throw kernelError(\"bot_exit 未配置(装配方未注入退出回调)\", \"INVALID_STATE\");\n }\n await this.deps.exit();\n return null;\n }\n}\n\n/** 重启机器人(P2-12;重启交给装配方,缺省退化为退出)。 */\nexport class SetRestartAction extends BaseAction<BotExitPayload, null> {\n readonly name = \"set_restart\";\n readonly schema = botExitSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: ProcessControlDeps;\n\n constructor(deps: ProcessControlDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(_payload: BotExitPayload): Promise<null> {\n const restart = this.deps.restart ?? this.deps.exit;\n if (restart === undefined) {\n throw kernelError(\"set_restart 未配置(装配方未注入重启回调)\", \"INVALID_STATE\");\n }\n await restart();\n return null;\n }\n}\n","/** 资料类动作(P2-14):set_self_longnick / set_qq_profile / set_qq_avatar\n */\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { kernelError, type ProfileApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport type { OneBotApi } from \"../../api/one-bot-api.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\n/** URL 前缀(头像在线文件识别)。 */\nconst URL_PREFIX = /^https?:\\/\\//;\n\nconst setSelfLongnickSchema = z.object({\n longNick: z.string(),\n});\n\ntype SetSelfLongnickPayload = z.infer<typeof setSelfLongnickSchema>;\n\n/** 设置个性签名(P2-14 接 kernel ProfileApi.setLongNick)。 */\nexport class SetSelfLongnickAction extends BaseAction<SetSelfLongnickPayload, null> {\n readonly name = \"set_self_longnick\";\n readonly schema = setSelfLongnickSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly profileApi: ProfileApi;\n\n constructor(profileApi: ProfileApi) {\n super();\n this.profileApi = profileApi;\n }\n\n protected async _handle(payload: SetSelfLongnickPayload): Promise<null> {\n await this.profileApi.setLongNick(payload.longNick);\n return null;\n }\n}\n\nconst setQQProfileSchema = z.object({\n nickname: z.string(),\n personal_note: z.string().optional(),\n sex: z.union([z.number(), z.string()]).optional(),\n});\n\ntype SetQQProfilePayload = z.infer<typeof setQQProfileSchema>;\n\n/** 设置 QQ 资料(P2-14;nickname → setNickName,personal_note → setLongNick,sex 忽略)。 */\nexport class SetQQProfileAction extends BaseAction<SetQQProfilePayload, null> {\n readonly name = \"set_qq_profile\";\n readonly schema = setQQProfileSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly profileApi: ProfileApi;\n\n constructor(profileApi: ProfileApi) {\n super();\n this.profileApi = profileApi;\n }\n\n protected async _handle(payload: SetQQProfilePayload): Promise<null> {\n await this.profileApi.setNickName(payload.nickname);\n if (payload.personal_note !== undefined) {\n await this.profileApi.setLongNick(payload.personal_note);\n }\n return null;\n }\n}\n\nconst setQQAvatarSchema = z.object({\n /** 本地路径(URL 需先下载,由装配方 cacheDir 支持)。 */\n file: z.string(),\n});\n\ntype SetQQAvatarPayload = z.infer<typeof setQQAvatarSchema>;\n\n/** 设置头像依赖(cacheDir 供 URL 下载,OneBotApi 视图)。 */\nexport type SetQQAvatarDeps = Pick<OneBotApi, \"profileApi\" | \"cacheDir\">;\n\n/** 设置 QQ 头像(P2-14 接 kernel ProfileApi.setHeader)。 */\nexport class SetQQAvatarAction extends BaseAction<SetQQAvatarPayload, null> {\n readonly name = \"set_qq_avatar\";\n readonly schema = setQQAvatarSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: SetQQAvatarDeps;\n\n constructor(deps: SetQQAvatarDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SetQQAvatarPayload): Promise<null> {\n let filePath = payload.file;\n if (URL_PREFIX.test(filePath)) {\n filePath = await this.downloadToCache(filePath);\n }\n if (!existsSync(filePath)) {\n throw kernelError(`头像文件不存在: ${filePath}`, \"NOT_FOUND\");\n }\n await this.deps.profileApi.setHeader(filePath);\n return null;\n }\n\n /** URL 下载到缓存目录(cacheDir 缺省抛错)。 */\n private async downloadToCache(url: string): Promise<string> {\n const { cacheDir } = this.deps;\n if (cacheDir === undefined || cacheDir === \"\") {\n throw kernelError(\n \"set_qq_avatar 处理 URL 需要缓存目录(装配方未注入)\",\n \"INVALID_STATE\",\n );\n }\n const safeName = basename(new URL(url).pathname) || \"avatar.bin\";\n const filePath = join(cacheDir, `avatar-${Date.now()}-${safeName}`);\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`头像下载失败: ${res.status} ${res.statusText}`);\n }\n const buf = new Uint8Array(await res.arrayBuffer());\n writeFileSync(filePath, buf);\n return filePath;\n }\n}\n","/**\n * set_diy_online_status 动作:设置自定义在线状态(P2-12 接 kernel setOnlineStatus)\n *\n * customStatus(faceId/wording/faceType)随 setStatus 一并提交;\n * status 缺省 10(在线)。\n */\n\nimport type { MsgApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setDiyOnlineStatusSchema = z.object({\n status: z.number().optional(),\n /** 自定义状态文案。 */\n wording: z.string(),\n /** 表情 ID。 */\n face_id: z.string().optional(),\n /** 表情类型。 */\n face_type: z.string().optional(),\n});\n\ntype SetDiyOnlineStatusPayload = z.infer<typeof setDiyOnlineStatusSchema>;\n\n/** 默认在线状态值。 */\nconst STATUS_ONLINE = 10;\n\n/** 设置自定义在线状态(P2-12 接 kernel setOnlineStatus customStatus)。 */\nexport class SetDiyOnlineStatusAction extends BaseAction<SetDiyOnlineStatusPayload, null> {\n readonly name = \"set_diy_online_status\";\n readonly schema = setDiyOnlineStatusSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly msgApi: MsgApi;\n\n constructor(msgApi: MsgApi) {\n super();\n this.msgApi = msgApi;\n }\n\n protected async _handle(payload: SetDiyOnlineStatusPayload): Promise<null> {\n const customStatus = {\n faceId: payload.face_id ?? \"\",\n wording: payload.wording,\n faceType: payload.face_type ?? \"1\",\n };\n await this.msgApi.setOnlineStatus({\n status: payload.status ?? STATUS_ONLINE,\n extStatus: 0,\n batteryStatus: 0,\n customStatus,\n });\n return null;\n }\n}\n","/**\n * set_online_status 动作:设置在线状态(P2-12 接 kernel MsgApi.setOnlineStatus)\n *\n * status/ext_status/battery_status 见 NapCat 状态表(在线 10 / 离开 30 / 隐身 40\n * / 忙碌 50 / Q我吧 60 / 请勿打扰 70 等)。\n */\n\nimport type { MsgApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst setOnlineStatusSchema = z.object({\n status: z.number().optional(),\n ext_status: z.number().optional(),\n battery_status: z.number().optional(),\n});\n\ntype SetOnlineStatusPayload = z.infer<typeof setOnlineStatusSchema>;\n\n/** 默认在线状态值。 */\nconst STATUS_ONLINE = 10;\n\n/** 设置在线状态(P2-12 接 kernel setOnlineStatus)。 */\nexport class SetOnlineStatusAction extends BaseAction<SetOnlineStatusPayload, null> {\n readonly name = \"set_online_status\";\n readonly schema = setOnlineStatusSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly msgApi: MsgApi;\n\n constructor(msgApi: MsgApi) {\n super();\n this.msgApi = msgApi;\n }\n\n protected async _handle(payload: SetOnlineStatusPayload): Promise<null> {\n await this.msgApi.setOnlineStatus({\n status: payload.status ?? STATUS_ONLINE,\n extStatus: payload.ext_status ?? 0,\n batteryStatus: payload.battery_status ?? 0,\n });\n return null;\n }\n}\n","/**\n * translate_en2zh 动作:英文单词翻译(P2-14 接 kernel RichMediaApi.translateWords)\n */\nimport type { RichMediaApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\n\nconst translateEn2ZhSchema = z.object({\n words: z.array(z.string()),\n});\n\ntype TranslateEn2ZhPayload = z.infer<typeof translateEn2ZhSchema>;\n\n/** 英文单词翻译(P2-14)。 */\nexport class TranslateEn2ZhAction extends BaseAction<TranslateEn2ZhPayload, { words: string[] }> {\n readonly name = \"translate_en2zh\";\n readonly schema = translateEn2ZhSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly richMediaApi: RichMediaApi;\n\n constructor(richMediaApi: RichMediaApi) {\n super();\n this.richMediaApi = richMediaApi;\n }\n\n protected async _handle(payload: TranslateEn2ZhPayload): Promise<{ words: string[] }> {\n const words = await this.richMediaApi.translateWords(payload.words);\n return { words };\n }\n}\n","/**\n * OneBot 11 动作注册表(ADR-013 延伸)\n * 各协议维护自己的 ActionRegistry,由协议 adapter 挂到请求分发。\n * P2-16:deps 收敛为 { api: OneBotApi } 单聚合对象(基础设施第一项)。\n *\n * 同时是 action 域 barrel:re-export 全部动作类 + error-map + resolve-uid,\n * 协议外部只从本入口消费动作面。\n */\nimport { ActionRegistry } from \"../../core/index.js\";\nimport type { OneBotApi } from \"../api/index.js\";\n\nexport { ob11ErrorCodeMap } from \"./error-map.js\";\nexport type { AtAllRemainInfo } from \"./group/get-group-at-all-remain.js\";\nexport { resolveUid } from \"./resolve-uid.js\";\n\nimport { DeleteFriendAction } from \"./friend/delete-friend.js\";\nimport { GetDoubtFriendsAddRequestAction } from \"./friend/get-doubt-friends-add-request.js\";\nimport { GetFriendListAction } from \"./friend/get-friend-list.js\";\nimport { GetFriendsWithCategoryAction } from \"./friend/get-friends-with-category.js\";\nimport { GetStrangerInfoAction } from \"./friend/get-stranger-info.js\";\nimport { SendLikeAction } from \"./friend/send-like.js\";\nimport { SetDoubtFriendsAddRequestAction } from \"./friend/set-doubt-friends-add-request.js\";\nimport { SetFriendAddRequestAction } from \"./friend/set-friend-add-request.js\";\nimport { SetFriendRemarkAction } from \"./friend/set-friend-remark.js\";\nimport { DeleteEssenceMsgAction } from \"./group/delete-essence-msg.js\";\nimport { GetEssenceMsgListAction } from \"./group/get-essence-msg-list.js\";\nimport {\n GetGroupAddRequestAction,\n GetGroupIgnoredNotifiesAction,\n} from \"./group/get-group-add-request.js\";\nimport { GetGroupAtAllRemainAction } from \"./group/get-group-at-all-remain.js\";\nimport { GetGroupHonorInfoAction } from \"./group/get-group-honor-info.js\";\nimport { GetGroupInfoAction } from \"./group/get-group-info.js\";\nimport { GetGroupListAction } from \"./group/get-group-list.js\";\nimport { GetGroupMemberInfoAction } from \"./group/get-group-member-info.js\";\nimport { GetGroupMemberListAction } from \"./group/get-group-member-list.js\";\nimport { GetGroupShutListAction } from \"./group/get-group-shut-list.js\";\nimport { GetGroupSystemMsgAction } from \"./group/get-group-system-msg.js\";\nimport {\n CreateGroupFileFolderAction,\n DeleteGroupFileAction,\n DeleteGroupFolderAction,\n MoveGroupFileAction,\n RenameGroupFileAction,\n TransGroupFileAction,\n} from \"./group/group-files-op.js\";\nimport {\n GetGroupFileSystemInfoAction,\n GetGroupFilesByFolderAction,\n GetGroupRootFilesAction,\n} from \"./group/group-files-query.js\";\nimport { SetEssenceMsgAction } from \"./group/set-essence-msg.js\";\nimport { SetGroupAddRequestAction } from \"./group/set-group-add-request.js\";\nimport { SetGroupAdminAction } from \"./group/set-group-admin.js\";\nimport { SetGroupBanAction } from \"./group/set-group-ban.js\";\nimport { SetGroupCardAction } from \"./group/set-group-card.js\";\nimport { SetGroupKickAction } from \"./group/set-group-kick.js\";\nimport { SetGroupLeaveAction } from \"./group/set-group-leave.js\";\nimport { SetGroupNameAction } from \"./group/set-group-name.js\";\nimport { SetGroupWholeBanAction } from \"./group/set-group-whole-ban.js\";\nimport { DeleteMsgAction } from \"./message/delete-msg.js\";\nimport { FetchPttTextAction } from \"./message/fetch-ptt-text.js\";\nimport {\n ForwardFriendSingleMsgAction,\n ForwardGroupSingleMsgAction,\n} from \"./message/forward-single-msg.js\";\nimport { GetForwardMsgAction } from \"./message/get-forward-msg.js\";\nimport { GetFriendMsgHistoryAction } from \"./message/get-friend-msg-history.js\";\nimport { GetGroupMsgHistoryAction } from \"./message/get-group-msg-history.js\";\nimport { GetImageAction, GetRecordAction } from \"./message/get-media.js\";\nimport { GetMsgAction } from \"./message/get-msg.js\";\nimport { MarkMsgAsReadAction } from \"./message/mark-msg-as-read.js\";\nimport {\n MarkGroupMsgAsReadAction,\n MarkPrivateMsgAsReadAction,\n} from \"./message/mark-msg-as-read-aliases.js\";\nimport {\n SendGroupForwardMsgAction,\n SendPrivateForwardMsgAction,\n} from \"./message/send-forward-msg.js\";\nimport { SendGroupMsgAction } from \"./message/send-group-msg.js\";\nimport { SendMsgAction } from \"./message/send-msg.js\";\nimport { SendPrivateMsgAction } from \"./message/send-private-msg.js\";\nimport { SetInputStatusAction } from \"./message/set-input-status.js\";\nimport { SetMsgEmojiLikeAction } from \"./message/set-msg-emoji-like.js\";\nimport { CanSendImageAction } from \"./system/can-send-image.js\";\nimport { CanSendRecordAction } from \"./system/can-send-record.js\";\nimport { CleanCacheAction } from \"./system/clean-cache.js\";\nimport { DownloadFileAction } from \"./system/download-file.js\";\nimport { GetClientkeyAction } from \"./system/get-clientkey.js\";\nimport { GetCookiesAction } from \"./system/get-cookies.js\";\nimport { GetCredentialsAction, GetCsrfTokenAction } from \"./system/get-credentials.js\";\nimport { GetLoginInfoAction } from \"./system/get-login-info.js\";\nimport { GetRobotUinRangeAction } from \"./system/get-robot-uin-range.js\";\nimport { GetStatusAction } from \"./system/get-status.js\";\nimport { GetVersionInfoAction } from \"./system/get-version-info.js\";\nimport { BotExitAction, SetRestartAction } from \"./system/process-control.js\";\nimport {\n SetQQAvatarAction,\n SetQQProfileAction,\n SetSelfLongnickAction,\n} from \"./system/profile-actions.js\";\nimport { SetDiyOnlineStatusAction } from \"./system/set-diy-online-status.js\";\nimport { SetOnlineStatusAction } from \"./system/set-online-status.js\";\nimport { TranslateEn2ZhAction } from \"./system/translate-en2zh.js\";\n\n/** 动作注册表依赖(P2-16:动作只依赖一个聚合对象)。 */\nexport interface Ob11ActionDeps {\n /** OneBotApi 聚合(9 个 kernel apis + messageUnique + self/system)。 */\n api: OneBotApi;\n}\n\n/** 构建 OB11 动作注册表(所有 OB11 动作在此注册,按组拆分控制行数)。 */\nexport function createOb11ActionRegistry(deps: Ob11ActionDeps): ActionRegistry {\n const registry = new ActionRegistry();\n registerMsgActions(registry, deps);\n registerForwardActions(registry, deps);\n registerQueryActions(registry, deps);\n registerGroupActions(registry, deps);\n registerFriendActions(registry, deps);\n registerSystemActions(registry, deps);\n registerGroupNotifyActions(registry, deps);\n registerTicketActions(registry, deps);\n registerProfileActions(registry, deps);\n registerGroupFileActions(registry, deps);\n registerWebActions(registry, deps);\n return registry;\n}\n\n/** 群空间 web / csrf / 陌生人 / 群请求动作(P2-15)。 */\nfunction registerWebActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new GetStrangerInfoAction(deps.api.profileApi));\n registry.register(new GetCsrfTokenAction(deps.api));\n registry.register(new GetCredentialsAction(deps.api));\n registry.register(new GetGroupAddRequestAction(deps.api.groupNotifyApi));\n registry.register(new GetGroupIgnoredNotifiesAction(deps.api.groupNotifyApi));\n registry.register(new GetEssenceMsgListAction(deps.api.webApi));\n registry.register(new GetGroupHonorInfoAction(deps.api.webApi));\n}\n\n/** 资料/点赞/翻译动作(P2-14)。 */\nfunction registerProfileActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SetSelfLongnickAction(deps.api.profileApi));\n registry.register(new SetQQProfileAction(deps.api.profileApi));\n registry.register(new SetQQAvatarAction(deps.api));\n registry.register(new TranslateEn2ZhAction(deps.api.richMediaApi));\n registry.register(new SendLikeAction(deps.api));\n}\n\n/** 群文件动作(P2-14)。 */\nfunction registerGroupFileActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new GetGroupRootFilesAction(deps.api.richMediaApi));\n registry.register(new GetGroupFilesByFolderAction(deps.api.richMediaApi));\n registry.register(new GetGroupFileSystemInfoAction(deps.api.richMediaApi));\n registry.register(new CreateGroupFileFolderAction(deps.api.richMediaApi));\n registry.register(new DeleteGroupFileAction(deps.api.richMediaApi));\n registry.register(new DeleteGroupFolderAction(deps.api.richMediaApi));\n registry.register(new RenameGroupFileAction(deps.api.richMediaApi));\n registry.register(new MoveGroupFileAction(deps.api.richMediaApi));\n registry.register(new TransGroupFileAction(deps.api.richMediaApi));\n}\n\n/** 群通知/禁言列表动作(P2-13)。 */\nfunction registerGroupNotifyActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SetGroupAddRequestAction(deps.api.groupNotifyApi));\n registry.register(new GetGroupSystemMsgAction(deps.api));\n registry.register(new GetGroupShutListAction(deps.api));\n}\n\n/** 票据动作(P2-13)。 */\nfunction registerTicketActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new GetClientkeyAction(deps.api.ticketApi));\n registry.register(new GetCookiesAction(deps.api));\n}\n\n/** 合并转发 / 单条转发 / 在线状态(P2-12)。 */\nfunction registerForwardActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SendGroupForwardMsgAction(deps.api));\n registry.register(new SendPrivateForwardMsgAction(deps.api));\n registry.register(new GetForwardMsgAction(deps.api));\n registry.register(new ForwardGroupSingleMsgAction(deps.api));\n registry.register(new ForwardFriendSingleMsgAction(deps.api));\n registry.register(new SetOnlineStatusAction(deps.api.msgApi));\n registry.register(new SetDiyOnlineStatusAction(deps.api.msgApi));\n}\n\n/** 消息类动作(P2-3 / P2-10 / P2-11)。 */\nfunction registerMsgActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SendMsgAction(deps.api));\n registry.register(new SendPrivateMsgAction(deps.api));\n registry.register(new SendGroupMsgAction(deps.api));\n registry.register(new DeleteMsgAction(deps.api));\n registry.register(new GetMsgAction(deps.api));\n registry.register(new GetGroupMsgHistoryAction(deps.api));\n registry.register(new GetFriendMsgHistoryAction(deps.api));\n registry.register(new MarkMsgAsReadAction(deps.api));\n registry.register(new MarkPrivateMsgAsReadAction(deps.api));\n registry.register(new MarkGroupMsgAsReadAction(deps.api));\n registry.register(new SetMsgEmojiLikeAction(deps.api));\n registry.register(new FetchPttTextAction(deps.api));\n registry.register(new SetInputStatusAction(deps.api));\n registry.register(new GetImageAction(deps.api));\n registry.register(new GetRecordAction(deps.api));\n}\n\n/** 查询类动作(P2-4;P2-17 群信息/成员动作读 GroupCache)。 */\nfunction registerQueryActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new GetLoginInfoAction(deps.api.self));\n registry.register(new GetGroupInfoAction(deps.api));\n registry.register(new GetGroupListAction(deps.api));\n registry.register(new GetGroupMemberInfoAction(deps.api));\n registry.register(new GetGroupMemberListAction(deps.api));\n registry.register(new GetFriendListAction(deps.api.friendApi));\n}\n\n/** 群管类动作(P2-10)。 */\nfunction registerGroupActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SetGroupKickAction(deps.api.groupApi));\n registry.register(new SetGroupBanAction(deps.api.groupApi));\n registry.register(new SetGroupWholeBanAction(deps.api.groupApi));\n registry.register(new SetGroupAdminAction(deps.api.groupApi));\n registry.register(new SetGroupCardAction(deps.api.groupApi));\n registry.register(new SetGroupNameAction(deps.api.groupApi));\n registry.register(new SetGroupLeaveAction(deps.api.groupApi));\n registry.register(new SetEssenceMsgAction(deps.api));\n registry.register(new DeleteEssenceMsgAction(deps.api));\n registry.register(new GetGroupAtAllRemainAction(deps.api.groupApi));\n}\n\n/** 好友类动作(P2-11)。 */\nfunction registerFriendActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new SetFriendAddRequestAction(deps.api.friendApi));\n registry.register(new SetFriendRemarkAction(deps.api));\n registry.register(new DeleteFriendAction(deps.api));\n registry.register(new GetFriendsWithCategoryAction(deps.api.friendApi));\n registry.register(new GetDoubtFriendsAddRequestAction(deps.api.friendApi));\n registry.register(new SetDoubtFriendsAddRequestAction(deps.api.friendApi));\n}\n\n/** 系统类动作(P2-11 / P2-12)。 */\nfunction registerSystemActions(registry: ActionRegistry, deps: Ob11ActionDeps): void {\n registry.register(new GetStatusAction());\n registry.register(new GetVersionInfoAction(deps.api));\n registry.register(new CleanCacheAction(deps.api));\n registry.register(new CanSendImageAction());\n registry.register(new CanSendRecordAction());\n registry.register(new GetRobotUinRangeAction());\n registry.register(new DownloadFileAction(deps.api));\n registry.register(new BotExitAction(deps.api));\n registry.register(new SetRestartAction(deps.api));\n}\n\n/** action 域公共面(barrel re-export,协议外部从本入口消费动作类)。 */\nexport {\n BotExitAction,\n CanSendImageAction,\n CanSendRecordAction,\n CleanCacheAction,\n CreateGroupFileFolderAction,\n DeleteEssenceMsgAction,\n DeleteFriendAction,\n DeleteGroupFileAction,\n DeleteGroupFolderAction,\n DeleteMsgAction,\n DownloadFileAction,\n FetchPttTextAction,\n ForwardFriendSingleMsgAction,\n ForwardGroupSingleMsgAction,\n GetClientkeyAction,\n GetCookiesAction,\n GetCredentialsAction,\n GetCsrfTokenAction,\n GetDoubtFriendsAddRequestAction,\n GetEssenceMsgListAction,\n GetForwardMsgAction,\n GetFriendListAction,\n GetFriendMsgHistoryAction,\n GetFriendsWithCategoryAction,\n GetGroupAddRequestAction,\n GetGroupAtAllRemainAction,\n GetGroupFileSystemInfoAction,\n GetGroupFilesByFolderAction,\n GetGroupHonorInfoAction,\n GetGroupIgnoredNotifiesAction,\n GetGroupInfoAction,\n GetGroupListAction,\n GetGroupMemberInfoAction,\n GetGroupMemberListAction,\n GetGroupMsgHistoryAction,\n GetGroupRootFilesAction,\n GetGroupShutListAction,\n GetGroupSystemMsgAction,\n GetImageAction,\n GetLoginInfoAction,\n GetRecordAction,\n GetRobotUinRangeAction,\n GetStatusAction,\n GetStrangerInfoAction,\n GetVersionInfoAction,\n MarkGroupMsgAsReadAction,\n MarkMsgAsReadAction,\n MarkPrivateMsgAsReadAction,\n MoveGroupFileAction,\n RenameGroupFileAction,\n SendGroupForwardMsgAction,\n SendGroupMsgAction,\n SendLikeAction,\n SendMsgAction,\n SendPrivateForwardMsgAction,\n SendPrivateMsgAction,\n SetDiyOnlineStatusAction,\n SetDoubtFriendsAddRequestAction,\n SetEssenceMsgAction,\n SetFriendAddRequestAction,\n SetFriendRemarkAction,\n SetGroupAddRequestAction,\n SetGroupAdminAction,\n SetGroupBanAction,\n SetGroupCardAction,\n SetGroupKickAction,\n SetGroupLeaveAction,\n SetGroupNameAction,\n SetGroupWholeBanAction,\n SetInputStatusAction,\n SetMsgEmojiLikeAction,\n SetOnlineStatusAction,\n SetQQAvatarAction,\n SetQQProfileAction,\n SetRestartAction,\n SetSelfLongnickAction,\n TransGroupFileAction,\n TranslateEn2ZhAction,\n};\n","/**\n * OneBotApi:OneBot 11 动作的统一依赖聚合(P2-16,基础设施第一项)\n *\n * 单类持有 9 个 kernel apis + 协议层共享状态(messageUnique / self / system 回调),\n * 动作只依赖一个聚合对象(或 Pick 视图),boot.cjs 装配面只出现一个聚合对象。\n *\n * - 便捷方法 uinToUid / uidToUin 委托 groupApi(动作无需再注入转换函数)。\n * - 系统回调拍平为顶层字段(exactOptionalPropertyTypes:显式 `| undefined` 联合)。\n */\n\nimport type {\n FriendApi,\n GroupCache,\n GroupNotifyApi,\n MsgApi,\n ProfileApi,\n ProfileLikeApi,\n RichMediaApi,\n TicketApi,\n WebApi,\n} from \"@napuketto/kernel\";\nimport { GroupApi } from \"@napuketto/kernel\";\nimport type { GroupSenderRole } from \"../helper/data.js\";\nimport { MessageUnique } from \"../helper/message-unique.js\";\n\n/** 系统类本地回调(get_version_info / clean_cache / download_file / 进程控制用)。 */\nexport interface OneBotSystemOptions {\n /** 运行版本(get_version_info 用,缺省 unknown)。 */\n appVersion: string;\n /** 缓存清理回调(clean_cache 用,未配置抛错)。 */\n cleanCache?: () => Promise<void>;\n /** 缓存目录(download_file 保存路径 / get_image 主动下载落盘)。 */\n cacheDir?: string;\n /** QQ NT global 目录(get_image/get_record 解析 NT 相对路径用,2026-09-08 T5)。 */\n mediaBaseDir?: string;\n /** 进程退出回调(bot_exit 用)。 */\n exit?: () => Promise<void>;\n /** 进程重启回调(set_restart 用,缺省退化为退出)。 */\n restart?: () => Promise<void>;\n}\n\n/** OneBotApi 构造参数。 */\nexport interface OneBotApiOptions {\n msgApi: MsgApi;\n groupApi: GroupApi;\n groupNotifyApi: GroupNotifyApi;\n friendApi: FriendApi;\n ticketApi: TicketApi;\n richMediaApi: RichMediaApi;\n profileApi: ProfileApi;\n profileLikeApi: ProfileLikeApi;\n webApi: WebApi;\n /** 登录身份(get_login_info 用)。 */\n self: { uin: string; nickname: string };\n /** 系统类本地信息。 */\n system: OneBotSystemOptions;\n /** 群/成员缓存(ADR-008,读缓存动作用;未装配时动作直查 api)。 */\n groupCache?: GroupCache;\n}\n\n/**\n * OneBot 11 动作统一依赖聚合(P2-16)。\n * 各动作经 `Pick<OneBotApi, ...>` 取所需成员;注册处只构造一次本对象。\n */\nexport class OneBotApi {\n /** kernel 消息 API(send_msg 等消息类动作用)。 */\n readonly msgApi: MsgApi;\n /** kernel 群 API。 */\n readonly groupApi: GroupApi;\n /** kernel 群通知 API(群请求/禁言列表用)。 */\n readonly groupNotifyApi: GroupNotifyApi;\n /** kernel 好友 API。 */\n readonly friendApi: FriendApi;\n /** kernel 票据 API(get_clientkey/get_cookies 用)。 */\n readonly ticketApi: TicketApi;\n /** kernel 富媒体 API(群文件/翻译用)。 */\n readonly richMediaApi: RichMediaApi;\n /** kernel 资料 API(签名/昵称/头像用)。 */\n readonly profileApi: ProfileApi;\n /** kernel 点赞 API(send_like 用)。 */\n readonly profileLikeApi: ProfileLikeApi;\n /** kernel 群空间 web API(精华/荣誉用)。 */\n readonly webApi: WebApi;\n /** 群/成员缓存(ADR-008;翻译层只读消费,缺失惰性回填)。 */\n readonly groupCache: GroupCache | undefined;\n /** OB11 message_id ↔ NT msgId 双向映射(收链路与动作共用同一映射空间)。 */\n readonly messageUnique: MessageUnique;\n /** 登录身份(get_login_info 用)。 */\n readonly self: { uin: string; nickname: string };\n /** 机器人自身 uin(get_cookies / csrf 用)。 */\n readonly selfUin: string;\n /** 运行版本(get_version_info 用)。 */\n readonly appVersion: string;\n /** 缓存清理回调(clean_cache 用)。 */\n readonly cleanCache: (() => Promise<void>) | undefined;\n /** 缓存目录(download_file 用)。 */\n readonly cacheDir: string | undefined;\n /** QQ NT global 目录(媒体 NT 相对路径解析用)。 */\n readonly mediaBaseDir: string | undefined;\n /** 进程退出回调(bot_exit 用)。 */\n readonly exit: (() => Promise<void>) | undefined;\n /** 进程重启回调(set_restart 用)。 */\n readonly restart: (() => Promise<void>) | undefined;\n\n constructor(opts: OneBotApiOptions) {\n this.msgApi = opts.msgApi;\n this.groupApi = opts.groupApi;\n this.groupNotifyApi = opts.groupNotifyApi;\n this.friendApi = opts.friendApi;\n this.ticketApi = opts.ticketApi;\n this.richMediaApi = opts.richMediaApi;\n this.profileApi = opts.profileApi;\n this.profileLikeApi = opts.profileLikeApi;\n this.webApi = opts.webApi;\n this.groupCache = opts.groupCache;\n this.messageUnique = new MessageUnique();\n this.self = opts.self;\n this.selfUin = opts.self.uin;\n this.appVersion = opts.system.appVersion;\n this.cleanCache = opts.system.cleanCache;\n this.cacheDir = opts.system.cacheDir;\n this.mediaBaseDir = opts.system.mediaBaseDir;\n this.exit = opts.system.exit;\n this.restart = opts.system.restart;\n }\n\n /** uin→uid 转换(委托 groupApi;私聊目标/成员 user_id 用)。 */\n uinToUid(uins: string[]): Promise<Map<string, string>> {\n return this.groupApi.uinToUid(uins);\n }\n\n /** uid→uin 转换(委托 groupApi;notice/grayTip 用)。 */\n uidToUin(uids: string[]): Promise<Map<string, string>> {\n return this.groupApi.uidToUin(uids);\n }\n\n /**\n * 群成员角色(GroupCache 缓存优先,缺失惰性回填;sender.role 判定用)。\n * 未装配缓存 / 成员不在群 / 查询失败 → undefined(调用方回退缺省 \"member\",\n * 不阻塞消息上报)。\n */\n async groupMemberRole(groupCode: string, uid: string): Promise<GroupSenderRole | undefined> {\n if (this.groupCache === undefined) {\n return undefined;\n }\n try {\n const member = await this.groupCache.getMember(groupCode, uid);\n return member === undefined ? undefined : GroupApi.roleToString(member.role);\n } catch {\n return undefined;\n }\n }\n\n /**\n * 群成员角色表(历史消息批量用:一次整表读取,uid → role)。\n * 失败语义同 groupMemberRole。\n */\n async groupMemberRoles(groupCode: string): Promise<Map<string, GroupSenderRole> | undefined> {\n if (this.groupCache === undefined) {\n return undefined;\n }\n try {\n const out = new Map<string, GroupSenderRole>();\n for (const member of await this.groupCache.getMembers(groupCode)) {\n out.set(member.uid, GroupApi.roleToString(member.role));\n }\n return out;\n } catch {\n return undefined;\n }\n }\n}\n","/**\n * OB11 消息事件翻译(RawMessage → OB11 消息事件,纯函数,ADR-008)\n *\n * 与 message-info.ts 的 toOb11MessageInfo(get_msg/历史消息返回结构)是两套格式:\n * 事件带 self_id/post_type/message_id;信息结构用于动作返回。\n */\nimport type { RawMessage } from \"@napuketto/kernel\";\nimport { ChatType, toCanonicalElements } from \"@napuketto/kernel\";\nimport type {\n OB11GroupMessageEvent,\n OB11MessageEvent,\n OB11PrivateMessageEvent,\n} from \"../event/index.js\";\nimport type { GroupSender } from \"../event/message.js\";\nimport type { Sender } from \"../types/index.js\";\nimport {\n applyReceiveContext,\n canonicalToCqMessage,\n canonicalToSegments,\n type ReceiveTranslateContext,\n} from \"./data.js\";\nimport type { MessageUnique } from \"./message-unique.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/** RawMessage → OB11 消息事件(message_id 经 MessageUnique 映射并记录 peer)。\n * messageFormat 决定 message 字段格式:array = 消息段数组(标准),string = CQ 码字符串。\n * ctx(可选):接收方向 ID 转换上下文(at uid→uin、reply NT msgId→OB11 id,P2-19)。 */\nexport function toOb11MessageEvent(\n msg: RawMessage,\n selfUin: string,\n unique: MessageUnique,\n messageFormat: \"array\" | \"string\" = \"array\",\n ctx: ReceiveTranslateContext = {},\n): OB11MessageEvent {\n const elements = applyReceiveContext(toCanonicalElements(msg), ctx);\n const segments = canonicalToSegments(elements);\n const time = Math.floor(Number(msg.msgTime) / MS_TO_SEC);\n const selfId = Number(selfUin);\n const userId = Number(msg.senderUin);\n // 记录 peer:delete_msg / get_msg 等只有 message_id 的动作可反查\n const messageId = unique.alloc(msg.msgId, {\n chatType: msg.chatType,\n peerUid: msg.peerUid,\n });\n const base = {\n time,\n self_id: selfId,\n post_type: \"message\" as const,\n message_id: messageId,\n message: messageFormat === \"string\" ? canonicalToCqMessage(elements) : segments,\n raw_message: canonicalToCqMessage(elements),\n font: 0,\n };\n\n if (msg.chatType === ChatType.GROUP) {\n const sender: GroupSender = {\n user_id: userId,\n nickname: msg.sendNickName,\n // 发送者角色由调用方经 ctx 注入(GroupCache 查询在协议边界,翻译纯函数)\n role: ctx.senderRole ?? \"member\",\n };\n if (msg.sendMemberName !== undefined) {\n sender.card = msg.sendMemberName;\n }\n const event: OB11GroupMessageEvent = {\n ...base,\n message_type: \"group\",\n sub_type: \"normal\",\n group_id: Number(msg.peerUid),\n user_id: userId,\n sender,\n };\n return event;\n }\n\n // 私聊:C2C=好友,临时会话(群内私聊)sub_type=group\n let subType: \"friend\" | \"group\" = \"friend\";\n if (msg.chatType === ChatType.C2C_TEMP) {\n subType = \"group\";\n }\n const sender: Sender = {\n user_id: userId,\n nickname: msg.sendNickName,\n };\n const event: OB11PrivateMessageEvent = {\n ...base,\n message_type: \"private\",\n sub_type: subType,\n user_id: userId,\n sender,\n };\n return event;\n}\n","/**\n * OB11 notice 事件翻译·扩展源(c3,2026-09-10)\n *\n * 数据源 = kernel 桥 2026-09-10 新接线回调(notice.ts 的 grayTip 路径之外):\n * - Msg/onRecvOfflineFileMsg → OB11 offline_file notice(翻译)\n * - Msg/onRecvSysMsg / Msg/onRecvOnlineFileMsg / Group/onGroupEssenceListChange\n * → 暂不翻译(adapter 侧 raw 校准日志;sys msg 为群名片/头衔/精华等系统\n * 事件的总载体,真实 payload 到达后回填翻译)\n *\n * ⚠️ payload 形状未经真实事件校准(方法名证据 = wrapper.node 字符串,见 kernel\n * listeners 注释)——防御性收窄:未知形状返回 null,调用方打 raw 日志积累校准\n * 数据(与 narrowBuddyReqs 同模式)。翻译纯函数(ADR-008)。\n */\n\nimport type { OB11OfflineFileNoticeEvent } from \"../event/index.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/** 离线文件归一化项(收窄产物;字段名待真实事件校准)。 */\nexport interface OfflineFileLike {\n /** 发送者 uin(数字字符串;未知为 \"0\")。 */\n senderUin: string;\n name: string;\n size: number;\n /** 下载地址(未知为空串——OB11 offline_file 的 file.url 待校准数据源)。 */\n url: string;\n}\n\n/** 候选 uin 字段(按优先级取第一个数字串;uid 串不硬转——待校准)。 */\nfunction pickUin(item: Record<string, unknown>): string {\n for (const key of [\"senderUin\", \"fromUin\", \"peerUin\"]) {\n const v = item[key];\n if (typeof v === \"string\" && v !== \"\" && Number.isFinite(Number(v))) {\n return v;\n }\n }\n return \"0\";\n}\n\n/** 候选 url 字段(fileUrl / url;未知为空串)。 */\nfunction pickUrl(item: Record<string, unknown>): string {\n for (const key of [\"fileUrl\", \"url\"]) {\n const v = item[key];\n if (typeof v === \"string\" && v !== \"\") {\n return v;\n }\n }\n return \"\";\n}\n\n/** 单个候选对象 → 归一化项(不可识别返回 null)。接受两类形状:\n * ① RawMessage 型(elements[].fileElement——离线文件以消息推送到达的假设,\n * 与 onRecvOfflineFileMsg 挂在 MsgService、UpdateC2CFileMsg 字符串一致)\n * ② 专用实体型(顶层 fileName 或 fileInfo.fileName——getNewOfflineFileList 族) */\nfunction narrowItem(item: unknown): OfflineFileLike | null {\n if (typeof item !== \"object\" || item === null) {\n return null;\n }\n const obj = item as Record<string, unknown>;\n // ① RawMessage 型:fileElement 落在 elements 数组\n if (Array.isArray(obj[\"elements\"])) {\n const el = obj[\"elements\"].find(\n (e) => typeof e === \"object\" && e !== null && \"fileElement\" in e,\n ) as { fileElement?: Record<string, unknown> } | undefined;\n const file = el?.fileElement;\n if (file === undefined) {\n return null;\n }\n return {\n senderUin: pickUin(obj),\n name: typeof file[\"fileName\"] === \"string\" ? file[\"fileName\"] : \"\",\n size: Number(file[\"fileSize\"] ?? 0),\n url: pickUrl(file),\n };\n }\n // ② 专用实体型:顶层或 fileInfo 下的 fileName\n const file = (obj[\"fileInfo\"] as Record<string, unknown> | undefined) ?? obj;\n if (typeof file[\"fileName\"] !== \"string\") {\n return null;\n }\n return {\n senderUin: pickUin(obj),\n name: file[\"fileName\"],\n size: Number(file[\"fileSize\"] ?? 0),\n url: pickUrl(file),\n };\n}\n\n/**\n * onRecvOfflineFileMsg 参数 → 归一化项列表(防御性收窄)。\n * 接受数组 / 单对象;全部不可识别返回 null(调用方打 raw 日志)。\n * 空数组同样返回 null(无文件可翻译,与未知形状同走日志路径无害)。\n */\nexport function narrowOfflineFiles(arg: unknown): OfflineFileLike[] | null {\n const items = Array.isArray(arg) ? arg : [arg];\n const narrowed = items.map(narrowItem).filter((v): v is OfflineFileLike => v !== null);\n return narrowed.length > 0 ? narrowed : null;\n}\n\n/** 归一化项 → OB11 offline_file notice(time 取当前时刻,friend_add 同款)。 */\nexport function toOfflineFileNotice(\n item: OfflineFileLike,\n selfUin: string,\n): OB11OfflineFileNoticeEvent {\n return {\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(selfUin),\n post_type: \"notice\",\n notice_type: \"offline_file\",\n user_id: Number(item.senderUin),\n file: { name: item.name, size: item.size, url: item.url },\n };\n}\n","/**\n * OB11 sysmsg 识别表(2026-11-01 自 helper/sysmsg.ts 瘦身——解码层上移\n * core/sysmsg.ts 共享,milky.md §0.8.3/§0.8.6)\n *\n * 本模块只保留 OB11 侧内容:\n * - SysMsgNoticeKind:sysmsg 可映射的 OB11 notice 种类(event/notice.ts 既有类型)\n * - KIND_TABLE:(msgType, subType) → 规则(键 = 原生分发键)\n * - OBSERVED_UNNAMED:已观测但未命名的键(不广播,防校准日志噪音)\n * - recognizeSysMsg:绑定 OB11 表的识别入口\n *\n * 解码原语(decodeProtoTree / extractSysMsgEnvelope / narrowSysMsgBlobs 等)\n * 从 `core/sysmsg.js` 导入使用。\n */\n\nimport {\n recognizeSysMsg as recognizeSysMsgCore,\n type SysMsgKindRule,\n type SysMsgRecognition,\n} from \"../../core/sysmsg.js\";\nimport type { OB11GroupCardNoticeEvent, OB11NoticeEvent } from \"../event/index.js\";\n\n/** 群号判别(strings[0] 必须是数字串)。 */\nconst NUMERIC_RE = /^\\d+$/;\n\nexport type {\n SysMsgEnvelope,\n SysMsgField,\n SysMsgKindRule,\n SysMsgRecognition,\n} from \"../../core/sysmsg.js\";\nexport {\n decodeProtoTree,\n extractSysMsgEnvelope,\n narrowSysMsgBlobs,\n toHex,\n} from \"../../core/sysmsg.js\";\n\n/** OB11 识别规则:kind 收窄为 OB11 notice 种类、事件体为 OB11NoticeEvent。 */\nexport type SysMsgKindRuleOB11 = SysMsgKindRule<OB11NoticeEvent>;\n\n/**\n * 732:21 群名片变更(2026-11-01 批次三轮录制实证):collectStrings 顺序 =\n * [群号, 对象 uid, 新值, 旧值]。判别式:strings[0] 全数字 + strings[1] uid\n * 形(u_ 前缀)——不满足即弃(降级校准日志,防其他键的串污染误判)。\n */\nconst GROUP_CARD_RULE: SysMsgKindRuleOB11 = {\n kind: \"group_card\",\n collectUids: (_tree, env) => {\n const subject = env.strings[1];\n return subject?.startsWith(\"u_\") === true ? [subject] : [];\n },\n extract: (_tree, env, uinOf, ctx) => {\n const [groupCode, subject, cardNew, cardOld] = env.strings;\n if (\n groupCode === undefined ||\n subject === undefined ||\n !NUMERIC_RE.test(groupCode) ||\n !subject.startsWith(\"u_\")\n ) {\n return null;\n }\n const event: OB11GroupCardNoticeEvent = {\n time: ctx.time,\n self_id: ctx.selfUin,\n post_type: \"notice\",\n notice_type: \"group_card\",\n group_id: Number(groupCode),\n user_id: uinOf(subject),\n card_new: cardNew ?? \"\",\n card_old: cardOld ?? \"\",\n };\n return event;\n },\n};\n\n/**\n * (msgType, subType) → 规则表(键 = 原生分发键,design.md §7.1)。\n *\n * 2026-11-01 起不再是空表:732:21(群名片变更)为批次三轮录制取得的首个\n * 实证条目。card/title 等其余判别值仍无样本支撑,宁可漏报不错报;未识别\n * 一律走结构化校准日志,不广播。\n */\nconst KIND_TABLE: ReadonlyMap<string, SysMsgKindRuleOB11> = new Map([[\"732:21\", GROUP_CARD_RULE]]);\n\n/** 已观测但未命名的 (msgType, subType)(语义未知,不广播)。 */\nconst OBSERVED_UNNAMED: ReadonlySet<string> = new Set([\"528:382\", \"528:349\", \"528:381\"]);\n\n/** (msgType, subType) → 识别结果(绑定 OB11 表;table 参数供单测注入合成规则)。 */\nexport function recognizeOb11SysMsg(\n msgType: number | null,\n subType: number | null,\n table: ReadonlyMap<string, SysMsgKindRuleOB11> = KIND_TABLE,\n): SysMsgRecognition<OB11NoticeEvent> {\n return recognizeSysMsgCore(msgType, subType, table, OBSERVED_UNNAMED);\n}\n","/**\n * OB11 传输装配(P2-5,2026-08-05)\n *\n * 按 OB11Config 创建/装配 network 传输适配器:\n * - HTTP 反向(http.enabled):HttpServer 接收第三方调用 → handleRequest → 响应\n * - WS 反向(ws.enabled):WsServer 第三方连入 → handleRequest(echo 透传)+ 事件广播\n * - HTTP 正向(httpPost.enabled):HttpClient 事件上报(fire-and-forget)\n * - WS 正向(wsReverse.enabled):WsClient 主动连第三方(双向)\n *\n * 鉴权:token 存在时校验 Authorization: Bearer <token> / access_token 查询参数。\n * 返回 transports(事件上报用,注册到 broadcaster)与 close(停止时关闭全部)。\n */\nimport {\n type AuthorizeHook,\n type EventBroadcaster,\n HttpClient,\n HttpServer,\n type RequestContext,\n type TransportAdapter,\n WsClient,\n WsServer,\n} from \"@napuketto/network\";\nimport type { OB11Config } from \"./helper/index.js\";\n\n/** Authorization 头前缀。 */\nconst BEARER_PREFIX = \"Bearer \";\n\n/** 校验 URL 查询参数里的 access_token(WS client 连接 URL 可能带)。\n * ⚠️ req.url 是纯路径(无 origin),new URL(相对路径) 必抛——2026-09-08\n * T10 E2E 实测抓到的 bug(查询参数鉴权从未生效,WS 全被 4401 关闭),\n * 用 dummy base 解析。 */\nfunction hasAccessTokenQuery(url: string, token: string): boolean {\n try {\n const parsed = new URL(url, \"http://localhost\");\n return parsed.searchParams.get(\"access_token\") === token;\n } catch {\n return false;\n }\n}\n\n/** 校验 Authorization: Bearer <token> 头。 */\nfunction checkBearer(auth: string | undefined, token: string): boolean {\n if (auth === undefined || !auth.startsWith(BEARER_PREFIX)) {\n return false;\n }\n return auth.slice(BEARER_PREFIX.length) === token;\n}\n\n/** 构造鉴权钩子(token 未配置则不鉴权)。 */\nfunction makeAuthorize(token: string | undefined): AuthorizeHook | undefined {\n if (token === undefined || token === \"\") {\n return;\n }\n return (ctx: RequestContext): boolean => {\n const auth = ctx.headers[\"authorization\"] ?? ctx.headers[\"Authorization\"];\n if (checkBearer(auth, token) || ctx.headers[\"authorization\"] === token) {\n return true;\n }\n return hasAccessTokenQuery(ctx.url, token);\n };\n}\n\n/** 传输装配结果。 */\nexport interface Ob11TransportSet {\n /** 反向 server(HTTP/WS,第三方调用入口)。 */\n servers: TransportAdapter[];\n /** 事件上报传输(正向 client,已注册到 broadcaster)。 */\n transports: TransportAdapter[];\n /** 停止:关闭全部传输(幂等)。 */\n close: () => Promise<void>;\n}\n\n/** 传输装配选项。 */\nexport interface AssembleOb11TransportsOptions {\n /** OB11 配置。 */\n config: OB11Config;\n /** 事件广播(正向上报传输注册到它)。 */\n broadcaster: EventBroadcaster;\n /** 请求分发(adapter.handleRequest,HTTP/WS 共用)。 */\n handleRequest: (req: unknown, respond: (res: unknown) => void) => void;\n /** 机器人自身 uin(koishi 等第三方按 X-Self-ID 识别连接归属)。 */\n selfUin: string;\n}\n\n/**\n * OneBot 客户端标识头:koishi 的 onebot 适配器按\n * x-client-role === \"Universal\" 与 x-self-id 校验 WS 连接(NapCat 同款头),\n * 缺失会被 close(1008) 拒绝——连接虽握手成功但应用层不认。\n */\nfunction oneBotClientHeaders(selfUin: string): Record<string, string> {\n return {\n \"X-Self-ID\": selfUin,\n \"x-client-role\": \"Universal\",\n \"User-Agent\": \"OneBot/11\",\n };\n}\n\n/** 按配置装配 OB11 传输。 */\nexport function assembleOb11Transports(opts: AssembleOb11TransportsOptions): Ob11TransportSet {\n const { config, broadcaster, handleRequest, selfUin } = opts;\n const servers: TransportAdapter[] = [];\n const transports: TransportAdapter[] = [];\n\n assembleHttpServers(config, handleRequest, servers);\n assembleWsServers(config, handleRequest, servers);\n assembleHttpPosts(config, selfUin, transports);\n assembleWsReverses(config, selfUin, handleRequest, transports);\n\n // 注册事件上报传输(正向 client:HTTP 上报 / WS 正向)\n for (const t of transports) {\n broadcaster.register(t);\n }\n // 反向 server 也注册(2026-08-07 修复):反向 WS 客户端(koishi 等)连入后\n // 必须能收到事件广播(lifecycle/heartbeat/消息事件)。此前只注册正向传输,\n // 反向 WsServer 未注册 → 客户端连上后收不到任何事件(NapCat 语义:反向连接\n // 同样收广播)。HttpServer.send 为 no-op(HTTP 无推送),注册无害。\n for (const s of servers) {\n broadcaster.register(s);\n }\n\n return {\n servers,\n transports,\n close: async () => {\n await Promise.all([...servers, ...transports].map((t) => t.close()));\n for (const t of [...servers, ...transports]) {\n broadcaster.unregister(t);\n }\n },\n };\n}\n\n/** 装配 HTTP 反向 server 列表(每实例一个 HttpServer,共享 handleRequest)。 */\nfunction assembleHttpServers(\n config: OB11Config,\n handleRequest: (req: unknown, respond: (res: unknown) => void) => void,\n servers: TransportAdapter[],\n): void {\n for (const item of config.httpServers) {\n if (item.enabled) {\n const options: ConstructorParameters<typeof HttpServer>[0] = {\n host: item.host,\n port: item.port,\n };\n const authorize = makeAuthorize(item.token ?? config.token);\n if (authorize !== undefined) {\n options.authorize = authorize;\n }\n const server = new HttpServer(options);\n server.onRequest = handleRequest;\n servers.push(server);\n }\n }\n}\n\n/** 装配反向 WS server 列表(每实例一个 WsServer,心跳 ping + 鉴权)。 */\nfunction assembleWsServers(\n config: OB11Config,\n handleRequest: (req: unknown, respond: (res: unknown) => void) => void,\n servers: TransportAdapter[],\n): void {\n for (const item of config.wsServers) {\n if (item.enabled) {\n const options: ConstructorParameters<typeof WsServer>[0] = {\n host: item.host,\n port: item.port,\n heartbeat: { intervalMs: item.heartbeatInterval },\n };\n const authorize = makeAuthorize(item.token ?? config.token);\n if (authorize !== undefined) {\n options.authorize = authorize;\n }\n const server = new WsServer(options);\n server.onRequest = handleRequest;\n servers.push(server);\n }\n }\n}\n\n/** 装配 HTTP 正向上报 client 列表(fire-and-forget)。 */\nfunction assembleHttpPosts(\n config: OB11Config,\n selfUin: string,\n transports: TransportAdapter[],\n): void {\n for (const item of config.httpPostUrls) {\n if (item.enabled && item.url !== undefined) {\n // koishi HTTP 上报同样按 x-self-id 识别 bot(缺失返回 403)\n const headers = {\n \"x-self-id\": selfUin,\n ...(authorizeHeader(item.token ?? config.token) ?? {}),\n };\n const options: ConstructorParameters<typeof HttpClient>[0] = {\n url: item.url,\n headers,\n };\n if (item.timeoutMs !== undefined) {\n options.timeoutMs = item.timeoutMs;\n }\n transports.push(new HttpClient(options));\n }\n }\n}\n\n/** 装配正向 WS client 列表(双向,心跳 + 重连 + 证书选项)。 */\nfunction assembleWsReverses(\n config: OB11Config,\n selfUin: string,\n handleRequest: (req: unknown, respond: (res: unknown) => void) => void,\n transports: TransportAdapter[],\n): void {\n for (const item of config.wsReverseUrls) {\n if (item.enabled && item.url !== undefined) {\n // koishi 等第三方按 X-Self-ID / x-client-role 识别并校验连接(NapCat 同款头),\n // 与 authorization 合并后作为握手请求头\n const headers = {\n ...oneBotClientHeaders(selfUin),\n ...(authorizeHeader(item.token ?? config.token) ?? {}),\n };\n // 独立构造重连策略:maxAttempts 条件附加(exactOptionalPropertyTypes)\n const reconnect: { enabled: boolean; delayMs: number; maxAttempts?: number } = {\n enabled: true,\n delayMs: item.reconnectDelayMs,\n };\n if (item.maxReconnectAttempts !== undefined) {\n reconnect.maxAttempts = item.maxReconnectAttempts;\n }\n const options: ConstructorParameters<typeof WsClient>[0] = {\n url: item.url,\n headers,\n heartbeat: { intervalMs: item.heartbeatInterval },\n reconnect,\n rejectUnauthorized: item.rejectUnauthorized,\n };\n const client = new WsClient(options);\n client.onRequest = handleRequest;\n transports.push(client);\n }\n }\n}\n\n/** token → Authorization 头(client 上报/连接用)。 */\nfunction authorizeHeader(token: string | undefined): Record<string, string> | undefined {\n if (token === undefined || token === \"\") {\n return;\n }\n return { authorization: `${BEARER_PREFIX}${token}` };\n}\n","/**\n * NapukettoOneBot11Adapter:OneBot 11 协议适配器(P2-3:收发闭环)\n *\n * - 收链路:订阅 kernel 消息事件通道 → RawMessage 翻译 OB11 消息事件 → network 广播\n * - 发链路:handleRequest(OB11 标准 { action, params, echo })→ 动作注册表 → kernel apis\n *\n * 生命周期走 BaseProtocolAdapter 骨架(start 校验配置 → onStart 订阅 → stop 退订)。\n * 翻译为纯函数(ADR-008):只读入参(RawMessage),不调 API、不读缓存。\n */\n\nimport type {\n BuddyCacheEventChannel,\n BuddyEventChannel,\n BuddyReq,\n GroupEventChannel,\n GroupNotify,\n MsgEventChannel,\n RawMessage,\n} from \"@napuketto/kernel\";\nimport { ChatType, toCanonicalElements } from \"@napuketto/kernel\";\nimport type { EventBroadcaster } from \"@napuketto/network\";\nimport {\n type ActionRegistry,\n type ActionResult,\n BaseProtocolAdapter,\n type ProtocolConfig,\n} from \"../core/index.js\";\nimport { subscribeRawMessages } from \"../core/raw-message.js\";\nimport { createOb11ActionRegistry } from \"./action/index.js\";\nimport type { OneBotApiOptions } from \"./api/index.js\";\nimport { OneBotApi } from \"./api/index.js\";\nimport type { OB11Config } from \"./helper/index.js\";\nimport { collectReceiveNeeds, type ReceiveTranslateContext } from \"./helper/index.js\";\nimport { toOb11MessageEvent } from \"./helper/message-event.js\";\nimport {\n collectGrayTipUids,\n hasFileElement,\n hasGrayTip,\n toFriendAdd,\n toGroupUpload,\n toOb11NoticeEvent,\n} from \"./helper/notice.js\";\nimport { narrowOfflineFiles, toOfflineFileNotice } from \"./helper/notice-extra.js\";\nimport {\n narrowBuddyReqs,\n type RequestTranslateContext,\n toOb11FriendRequestEvent,\n toOb11GroupRequestEvent,\n} from \"./helper/request.js\";\nimport {\n decodeProtoTree,\n extractSysMsgEnvelope,\n narrowSysMsgBlobs,\n recognizeOb11SysMsg,\n type SysMsgEnvelope,\n type SysMsgField,\n type SysMsgKindRuleOB11,\n toHex,\n} from \"./helper/sysmsg.js\";\nimport type { Ob11TransportSet } from \"./transport.js\";\nimport { assembleOb11Transports } from \"./transport.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/**\n * info/warn 级 raw 字段截断上限(2026-10-25 输出内容治理):hex/base64/JSON\n * 原文对运行状态无信息量,保留前缀定位 + 缺省长度;完整值仅在 debug 级\n * ([log.levels].ob11 = \"debug\")与日志文件中出现。\n */\nconst RAW_INFO_LIMIT = 64;\n\n/** raw 字段截断:超限截断 + 缺省长度标注(…(+N))。 */\nfunction truncRaw(value: string | undefined, keep = RAW_INFO_LIMIT): string {\n if (value === undefined) {\n return \"\";\n }\n return value.length <= keep ? value : `${value.slice(0, keep)}…(+${value.length - keep})`;\n}\n\n/** 最小 logger 面(校准日志用:未知事件形状打 raw JSON;缺省静默)。 */\nexport interface AdapterLoggerLike {\n warn(obj: unknown, msg?: string): void;\n info(obj: unknown, msg?: string): void;\n /** 校准数据(2026-10-25 级别重分配:info → debug;此面必须支持)。 */\n debug(obj: unknown, msg?: string): void;\n}\n\n/** 适配器构造参数(api 相关字段继承 OneBotApiOptions,P2-16 聚合)。 */\nexport interface OneBot11AdapterOptions extends OneBotApiOptions {\n /** 协议配置(zod 校验 + JSON 读写)。 */\n config: ProtocolConfig<OB11Config>;\n /** network 事件广播(注册传输适配器后 emit 推给第三方)。 */\n broadcaster: EventBroadcaster;\n /** kernel 消息事件通道(消息收链路入口)。 */\n msgChannel: MsgEventChannel;\n /** kernel 群事件通道(可选:Group/onGroupNotifiesUpdated → OB11 request 源)。 */\n groupChannel?: GroupEventChannel;\n /** kernel 好友事件通道(可选:Buddy/onBuddyReqChange → OB11 request 源)。 */\n friendChannel?: BuddyEventChannel;\n /** 好友缓存 diff 通道(可选:BuddyCache/onBuddyAdded → OB11 friend_add 源,B2)。 */\n buddyCacheEvents?: BuddyCacheEventChannel;\n /** 校准日志(可选:未知事件形状 raw JSON;IPC 模式传 loader pino 实例)。 */\n logger?: AdapterLoggerLike;\n}\n\n/** OneBot 11 协议适配器。 */\nexport class NapukettoOneBot11Adapter extends BaseProtocolAdapter<OB11Config> {\n readonly protocol = \"onebot11\";\n\n private readonly msgChannel: MsgEventChannel;\n private readonly groupChannel: GroupEventChannel | undefined;\n private readonly friendChannel: BuddyEventChannel | undefined;\n private readonly buddyCacheEvents: BuddyCacheEventChannel | undefined;\n private readonly calibLogger: AdapterLoggerLike | undefined;\n private readonly selfUin: string;\n private readonly oneBotApi: OneBotApi;\n /** 动作注册表(公共只读:IPC 桥等装配方枚举动作名直接挂载)。 */\n readonly registry: ActionRegistry;\n private unsubscribes: Array<() => void> = [];\n private transports: Ob11TransportSet | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private reportSelfMessage = false;\n private messageFormat: \"array\" | \"string\" = \"array\";\n /** 群文件报形式(B4):true = fileElement 群消息报 group_upload notice 替代 message。 */\n private groupUploadAsNotice = false;\n /** IPC 桥模式标记(subscribeOnly 启动;reload 时跳过传输重建)。 */\n private subscribedOnly = false;\n\n constructor(opts: OneBot11AdapterOptions) {\n super({\n config: opts.config,\n broadcaster: opts.broadcaster,\n hooks: {\n onStart: (config) => this.startTransports(config as OB11Config),\n onStop: () => this.stopAll(),\n onReload: (config) => this.reloadTransports(config as OB11Config),\n },\n });\n this.msgChannel = opts.msgChannel;\n this.groupChannel = opts.groupChannel;\n this.friendChannel = opts.friendChannel;\n this.buddyCacheEvents = opts.buddyCacheEvents;\n this.calibLogger = opts.logger;\n this.selfUin = opts.self.uin;\n this.oneBotApi = new OneBotApi(opts);\n this.registry = createOb11ActionRegistry({ api: this.oneBotApi });\n }\n\n /**\n * 配置热更新(P2-6,2026-09-08 实现):stop 旧传输/心跳/退订 → 按新配置重建。\n * IPC 桥模式(subscribeOnly,无传输)只刷新上报开关字段,不重建。\n */\n private async reloadTransports(config: OB11Config): Promise<void> {\n if (this.subscribedOnly) {\n this.reportSelfMessage = config.reportSelfMessage;\n this.messageFormat = config.messagePostFormat;\n this.groupUploadAsNotice = config.groupUploadAsNotice;\n return;\n }\n await this.stopAll();\n await this.startTransports(config);\n }\n\n /** 启动传输:装配(HTTP/WS)+ 打开 server/client + 广播 lifecycle enable + 起心跳。 */\n private async startTransports(config: OB11Config): Promise<void> {\n // start() 即装传输:脱离 IPC 桥模式(复查发现的潜在混用序,防御复位)\n this.subscribedOnly = false;\n // 全局上报开关与消息格式(订阅处消费)\n this.reportSelfMessage = config.reportSelfMessage;\n this.messageFormat = config.messagePostFormat;\n this.groupUploadAsNotice = config.groupUploadAsNotice;\n const broadcaster = this.getBroadcaster();\n if (broadcaster !== undefined) {\n this.transports = assembleOb11Transports({\n config,\n broadcaster,\n selfUin: this.selfUin,\n handleRequest: (req, respond) => {\n this.handleRequest(req, respond).catch((err: unknown) => {\n let message = String(err);\n if (err instanceof Error) {\n message = err.message;\n }\n respond({ status: \"failed\", retcode: 999, data: null, message });\n });\n },\n });\n // 打开 server + 正向 client\n await Promise.all(this.transports.servers.map((s) => s.open()));\n await Promise.all(this.transports.transports.map((t) => t.open()));\n }\n this.subscribe();\n // lifecycle: enable\n this.broadcastEvent({\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(this.selfUin),\n post_type: \"meta_event\",\n meta_event_type: \"lifecycle\",\n sub_type: \"enable\",\n });\n // 心跳\n this.startHeartbeat(config.heartbeatInterval);\n }\n\n /** 心跳 meta 事件(interval 毫秒,0 关闭)。 */\n private startHeartbeat(intervalMs: number): void {\n if (intervalMs <= 0) {\n return;\n }\n this.heartbeatTimer = setInterval(() => {\n this.broadcastEvent({\n time: Math.floor(Date.now() / MS_TO_SEC),\n self_id: Number(this.selfUin),\n post_type: \"meta_event\",\n meta_event_type: \"heartbeat\",\n interval: intervalMs,\n status: { online: true, good: true },\n });\n }, intervalMs);\n }\n\n /** 停止:心跳 + 传输 + 退订。 */\n private async stopAll(): Promise<void> {\n if (this.heartbeatTimer !== null) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n this.unsubscribeAll();\n if (this.transports !== null) {\n await this.transports.close();\n this.transports = null;\n }\n }\n\n /** 订阅 kernel 事件(消息 + 群通知 + 好友请求,幂等)。 */\n private subscribe(): void {\n if (this.unsubscribes.length > 0) {\n return;\n }\n // onRecvMsg 回调参数为消息数组(2026-08-07 运行时实证)——遍历逐条翻译。\n this.unsubscribes.push(\n subscribeRawMessages(this.msgChannel, (msg) => {\n // grayTip(系统事件)→ notice;否则 → 消息事件\n if (hasGrayTip(msg)) {\n this.broadcastNotice(msg).catch(() => {\n // notice 翻译失败静默(grayTip 解析宽容)\n });\n return;\n }\n // 自身消息:默认不上报(OB11 规范行为;reportSelfMessage=true 时上报)\n if (!this.reportSelfMessage && String(msg.senderUin) === this.selfUin) {\n return;\n }\n // 群文件报形式开关(B4):on = group_upload notice 替代 message 事件\n if (\n this.groupUploadAsNotice &&\n msg.chatType === ChatType.GROUP &&\n hasFileElement(msg)\n ) {\n const notice = toGroupUpload(msg, this.selfUin);\n if (notice !== null) {\n this.broadcastEvent(notice);\n return;\n }\n }\n void this.broadcastMessageEvent(msg);\n }),\n );\n // 离线文件(c3,2026-09-10):Msg/onRecvOfflineFileMsg → OB11 offline_file\n // notice(payload 形状待校准:防御性收窄,未知形状 raw 日志积累)\n this.unsubscribes.push(\n this.msgChannel.on(\"Msg/onRecvOfflineFileMsg\", (arg) => {\n const items = narrowOfflineFiles(arg);\n if (items === null) {\n this.calibLogger?.warn(\n { raw: truncRaw(JSON.stringify(arg)) },\n \"ob11: onRecvOfflineFileMsg 未知参数形状\",\n );\n return;\n }\n for (const item of items) {\n this.broadcastEvent(toOfflineFileNotice(item, this.selfUin));\n }\n }),\n );\n // sys msg 总闸(c3 接线;2026-09-10 解码回填,design.md §7):\n // 解码 → 识别 → 表命中才广播;未识别走结构化校准日志。\n // ⚠️ 识别表当前为空(card/title/sign 判别值无样本支撑)= 全部校准日志。\n this.unsubscribes.push(\n this.msgChannel.on(\"Msg/onRecvSysMsg\", (arg) => {\n const blobs = narrowSysMsgBlobs(arg);\n if (blobs === null) {\n this.calibLogger?.warn(\n { raw: truncRaw(JSON.stringify(arg)) },\n \"ob11: onRecvSysMsg 未知参数形状\",\n );\n return;\n }\n for (const blob of blobs) {\n void this.handleSysMsgBlob(blob);\n }\n }),\n );\n // 在线文件:raw 校准日志(OB11 无对应通知类型;debug 级,2026-10-25)\n this.unsubscribes.push(\n this.msgChannel.on(\"Msg/onRecvOnlineFileMsg\", (arg) => {\n this.calibLogger?.debug(\n { raw: JSON.stringify(arg)?.slice(0, 2000) },\n \"ob11: onRecvOnlineFileMsg raw(校准数据)\",\n );\n }),\n );\n // 群系统通知 → OB11 group request(仅未处理的邀请/申请;doubt 可疑通知跳过)\n if (this.groupChannel !== undefined) {\n this.unsubscribes.push(\n this.groupChannel.on(\"Group/onGroupNotifiesUpdated\", (doubt, notifies) => {\n if (doubt || !Array.isArray(notifies)) {\n return;\n }\n void this.broadcastGroupRequests(notifies);\n }),\n );\n // 群精华列表变化(c3,2026-09-10):raw 校准日志(OB11 group_essence\n // 候选源;真实 payload 到达后回填翻译;debug 级,2026-10-25)\n this.unsubscribes.push(\n this.groupChannel.on(\"Group/onGroupEssenceListChange\", (arg) => {\n this.calibLogger?.debug(\n { raw: truncRaw(JSON.stringify(arg)) },\n \"ob11: onGroupEssenceListChange raw(group_essence 校准数据)\",\n );\n }),\n );\n }\n // 好友申请 → OB11 friend request(参数形状待真实事件校准,防御性收窄)\n if (this.friendChannel !== undefined) {\n this.unsubscribes.push(\n this.friendChannel.on(\"Buddy/onBuddyReqChange\", (arg) => {\n const reqs = narrowBuddyReqs(arg);\n if (reqs === null) {\n // 未知形状:raw 日志积累校准数据(T10 实测后回填 narrowBuddyReqs)\n this.calibLogger?.warn(\n { raw: truncRaw(JSON.stringify(arg)) },\n \"ob11: onBuddyReqChange 未知参数形状\",\n );\n return;\n }\n void this.broadcastFriendRequests(reqs);\n }),\n );\n // 好友列表变化:T10 实证 = BuddyCategory[] 全量快照(翻译走 kernel\n // BuddyCache diff,见下方 buddyCacheEvents);此处 raw 日志保留积累\n // 校准数据(快照字段较多,slice 截断)\n for (const evt of [\"Buddy/onBuddyListChange\", \"Buddy/onBuddyListChangedV2\"] as const) {\n this.unsubscribes.push(\n this.friendChannel.on(evt, (arg) => {\n this.calibLogger?.info(\n { raw: truncRaw(JSON.stringify(arg)) },\n `ob11: ${evt} raw(friend_add 校准数据)`,\n );\n }),\n );\n }\n }\n // 好友缓存 diff(B2,2026-09-08):快照对比出的新增 → friend_add notice。\n // diff/baseline 逻辑在 kernel BuddyCache(onBuddyListChange 全量快照,\n // 首帧只建 baseline),adapter 翻译保持纯函数。\n if (this.buddyCacheEvents !== undefined) {\n this.unsubscribes.push(\n this.buddyCacheEvents.on(\"BuddyCache/onBuddyAdded\", (entry) => {\n this.broadcastEvent(toFriendAdd(entry, this.selfUin));\n }),\n );\n }\n }\n\n /**\n * 仅启动接收链路(IPC 桥模式,2026-08-27):订阅消息通道维护 messageUnique +\n * 灰色通知翻译,与 start() 的差别仅在传输层——不装配 HTTP/WS、不起心跳、\n * 不广播 lifecycle。配置经 seed 装配(load() 返回内存初值)。\n */\n async subscribeOnly(): Promise<void> {\n const config = await this.config.load();\n this.reportSelfMessage = config.reportSelfMessage;\n this.messageFormat = config.messagePostFormat;\n this.groupUploadAsNotice = config.groupUploadAsNotice;\n this.subscribedOnly = true;\n this.subscribe();\n }\n\n /** 仅退订(与 subscribeOnly 配对的进程级清理;传输关闭仍走 stop())。 */\n unsubscribeOnly(): void {\n this.subscribedOnly = false;\n this.unsubscribeAll();\n }\n\n /**\n * 单条 sysmsg 字节块:解码 → 识别 → 命中才广播,未识别打结构化校准日志\n * (识别表 2026-11-01 起含 732:21 group_card;design.md §7.5)。\n * 规则声明 collectUids 时先批量 uid→uin 再提取(异步 fire-and-forget)。\n */\n /** sysmsg 规则的 uid→uin 解析器(collectUids 声明才批量转换;失败/缺省恒 0)。 */\n private async sysMsgUinResolver(\n rule: SysMsgKindRuleOB11,\n tree: readonly SysMsgField[],\n env: SysMsgEnvelope,\n ): Promise<(uid: string) => number> {\n if (rule.collectUids === undefined) {\n return () => 0;\n }\n const uids = rule.collectUids(tree, env).filter((uid) => uid !== \"\");\n if (uids.length === 0) {\n return () => 0;\n }\n try {\n const map = await this.oneBotApi.uidToUin(uids);\n return (uid: string) => Number(map.get(uid) ?? 0);\n } catch {\n return () => 0;\n }\n }\n\n private async handleSysMsgBlob(blob: Uint8Array): Promise<void> {\n const tree = decodeProtoTree(blob);\n if (tree === null) {\n this.calibLogger?.warn(\n { raw: truncRaw(toHex(blob).slice(0, 1024)) },\n \"ob11: onRecvSysMsg protobuf 解码失败\",\n );\n return;\n }\n const env = extractSysMsgEnvelope(tree);\n const rec = recognizeOb11SysMsg(env.msgType, env.subType);\n if (rec.kind === \"notice\") {\n const uinOf = await this.sysMsgUinResolver(rec.rule, tree, env);\n const ctx = {\n selfUin: Number(this.selfUin),\n time: env.time ?? Math.floor(Date.now() / 1000),\n };\n const event = rec.rule.extract(tree, env, uinOf, ctx);\n if (event !== null) {\n this.broadcastEvent(event);\n return;\n }\n // 提取失败:降级校准日志(不硬广播半成品事件)\n }\n // 校准遥测(协议逆向用):info/warn 级不出(2026-10-25 级别重分配 + 截断),\n // debug 级保留全量字段(含 raw hex)供校准采集\n this.calibLogger?.debug(\n {\n verdict: rec.kind,\n msgType: env.msgType,\n subType: env.subType,\n subTypeAlt: env.subTypeAlt,\n groupCodes: env.groupCodes,\n time: env.time,\n actorUin: env.actorUin,\n actorUid: env.actorUid,\n strings: env.strings,\n raw: toHex(blob).slice(0, 1024),\n },\n \"ob11: onRecvSysMsg 校准数据(未识别,不广播)\",\n );\n }\n\n /**\n * 广播消息事件(P2-19:接收方向 ID 转换)。\n * 收集 at uid → 一次批量 uidToUin → 构造上下文 → 翻译广播。\n * 群消息另查发送者角色(GroupCache 缓存优先,失败回退缺省 member)。\n * 翻译失败退化为原样(不阻塞上报)。\n */\n private async broadcastMessageEvent(msg: RawMessage): Promise<void> {\n const elements = toCanonicalElements(msg);\n const { atUids } = collectReceiveNeeds(elements);\n let uidToUin: Map<string, string> | undefined;\n if (atUids.length > 0) {\n try {\n uidToUin = await this.oneBotApi.uidToUin(atUids);\n } catch {\n // uid 解析失败:at 原样(uid),不阻塞事件上报\n }\n }\n const senderRole =\n msg.chatType === ChatType.GROUP\n ? await this.oneBotApi.groupMemberRole(msg.peerUid, msg.senderUid)\n : undefined;\n const ctx: ReceiveTranslateContext = {\n ...(uidToUin !== undefined ? { uidToUin } : {}),\n ...(senderRole !== undefined ? { senderRole } : {}),\n msgIdToOb11Id: (msgId) => this.oneBotApi.messageUnique.getMessageId(msgId),\n };\n this.broadcastEvent(\n toOb11MessageEvent(\n msg,\n this.selfUin,\n this.oneBotApi.messageUnique,\n this.messageFormat,\n ctx,\n ),\n );\n }\n\n /** 广播 grayTip → notice 事件(批量 uidToUin 后翻译,纯函数)。 */\n private async broadcastNotice(msg: RawMessage): Promise<void> {\n const uids = collectGrayTipUids(msg);\n let uidToUin = new Map<string, string>();\n if (uids.length > 0) {\n uidToUin = await this.oneBotApi.uidToUin(uids);\n }\n const notice = toOb11NoticeEvent(msg, {\n selfUin: this.selfUin,\n uidToUin,\n ...(this.calibLogger !== undefined ? { logger: this.calibLogger } : {}),\n });\n if (notice !== null) {\n this.broadcastEvent(notice);\n }\n }\n\n /** 广播群系统通知 → OB11 group request 事件(批量 uidToUin 后翻译,纯函数)。 */\n private async broadcastGroupRequests(notifies: unknown[]): Promise<void> {\n const ctx: RequestTranslateContext = {\n selfUin: this.selfUin,\n uidToUin: await this.uidToUinMap(collectGroupNotifyUids(notifies)),\n };\n for (const n of notifies) {\n const event = toOb11GroupRequestEvent(n as GroupNotify, ctx);\n if (event !== null) {\n this.broadcastEvent(event);\n }\n }\n }\n\n /** 广播好友申请 → OB11 friend request 事件(批量 uidToUin 后翻译,纯函数)。 */\n private async broadcastFriendRequests(reqs: BuddyReq[]): Promise<void> {\n const ctx: RequestTranslateContext = {\n selfUin: this.selfUin,\n uidToUin: await this.uidToUinMap(\n reqs.map((r) => r.friendUid).filter((uid) => uid !== \"\"),\n ),\n };\n for (const req of reqs) {\n this.broadcastEvent(toOb11FriendRequestEvent(req, ctx));\n }\n }\n\n /** uid 批量 → uin(失败退空 Map:翻译层退化为 uid 数值,不阻塞请求上报)。 */\n private async uidToUinMap(uids: string[]): Promise<Map<string, string>> {\n if (uids.length === 0) {\n return new Map();\n }\n try {\n return await this.oneBotApi.uidToUin(uids);\n } catch {\n return new Map();\n }\n }\n\n /** 退订(幂等)。 */\n private unsubscribeAll(): void {\n for (const off of this.unsubscribes) {\n off();\n }\n this.unsubscribes = [];\n }\n\n /**\n * 请求分发(挂到 network transport 的 onRequest):\n * OB11 标准请求 { action, params, echo } → 动作注册表 → handle(HTTP)/websocketHandle(WS)。\n */\n async handleRequest(req: unknown, respond: (res: unknown) => void): Promise<void> {\n const parsed = (req ?? {}) as { action?: unknown; params?: unknown; echo?: unknown };\n // params 缺省 {}(OB11 规范允许省略;schema 校验在动作内,此处不判类型)\n const { action: rawAction, echo } = parsed;\n const params = parsed.params ?? {};\n let action = \"\";\n if (typeof rawAction === \"string\") {\n action = rawAction;\n }\n if (action === \"\") {\n respond({\n status: \"failed\",\n retcode: 404,\n data: null,\n message: \"请求缺少 action\",\n });\n return;\n }\n const act = this.registry.get(action);\n if (act === undefined) {\n respond({\n status: \"failed\",\n retcode: 404,\n data: null,\n message: `未知动作: ${action}`,\n });\n return;\n }\n let result: ActionResult<unknown>;\n if (echo === undefined) {\n result = await act.handle(params);\n } else {\n result = await act.websocketHandle(params, echo);\n }\n respond(result);\n }\n}\n\n/** 收集群系统通知涉及的 uid(user1/user2 双方,空 uid 跳过)。 */\nfunction collectGroupNotifyUids(notifies: unknown[]): string[] {\n const uids: string[] = [];\n for (const n of notifies) {\n const notify = n as { user1?: { uid?: unknown }; user2?: { uid?: unknown } };\n for (const u of [notify.user1, notify.user2]) {\n if (typeof u?.uid === \"string\" && u.uid !== \"\") {\n uids.push(u.uid);\n }\n }\n }\n return uids;\n}\n"],"mappings":"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"}