@napuketto/adapter 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/core/index.d.mts +2 -0
- package/dist/core/index.mjs +2 -0
- package/dist/core-Bj5L8WeZ.mjs +149 -0
- package/dist/core-Bj5L8WeZ.mjs.map +1 -0
- package/dist/index-C1nIfPiU.d.mts +109 -0
- package/dist/index-C1nIfPiU.d.mts.map +1 -0
- package/dist/index.d.mts +11 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1 -0
- package/dist/onebot11/index.d.mts +798 -0
- package/dist/onebot11/index.d.mts.map +1 -0
- package/dist/onebot11/index.mjs +3695 -0
- package/dist/onebot11/index.mjs.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["DEFAULT_COUNT","DEFAULT_COUNT","DEFAULT_COUNT","MS_TO_SEC","MS_TO_SEC","DEFAULT_DOMAIN","STATUS_ONLINE","MS_TO_SEC"],"sources":["../../src/onebot11/action/error-map.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/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-essence-msg.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/forward-single-msg.ts","../../src/onebot11/helper/config.ts","../../src/onebot11/helper/cqcode.ts","../../src/onebot11/helper/data.ts","../../src/onebot11/helper/message-info.ts","../../src/onebot11/helper/notice.ts","../../src/onebot11/action/message/get-forward-msg.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/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 * delete_friend 动作:删除好友(P2-11 接 kernel FriendApi.deleteFriend)\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 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 uidMap = await this.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 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 { 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 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 uidMap = await this.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 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 { 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 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 this.resolveUid(payload.user_id);\n this.deps.friendApi.setFriendRemark(uid, payload.remark);\n return null;\n }\n\n /** user_id(uin)→ uid。 */\n private async resolveUid(userId: number): Promise<string> {\n const uidMap = await this.deps.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 * 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 * delete_essence_msg 动作:取消精华消息(P2-10 接 kernel GroupApi.removeGroupEssence)\n */\n\nimport { ChatType, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.js\";\nimport type { EssenceMsgDeps } from \"./set-essence-msg.js\";\n\nconst deleteEssenceMsgSchema = z.object({\n message_id: z.union([z.number(), z.string()]),\n});\n\ntype DeleteEssenceMsgPayload = z.infer<typeof deleteEssenceMsgSchema>;\n\n/** 取消精华消息(P2-10 接 kernel removeGroupEssence)。 */\nexport class DeleteEssenceMsgAction extends BaseAction<DeleteEssenceMsgPayload, null> {\n readonly name = \"delete_essence_msg\";\n readonly schema = deleteEssenceMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: EssenceMsgDeps;\n\n constructor(deps: EssenceMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: DeleteEssenceMsgPayload): 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.deps.groupApi.removeGroupEssence(peer.peerUid, msgId);\n return null;\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)\n */\n\nimport type { GroupApi } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.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)。 */\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 groupApi: GroupApi;\n\n constructor(groupApi: GroupApi) {\n super();\n this.groupApi = groupApi;\n }\n\n protected async _handle(payload: GetGroupListPayload): Promise<GroupInfo[]> {\n const groups = await this.groupApi.getGroupList(payload.no_cache === true);\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_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\ntype SetEssenceMsgPayload = z.infer<typeof setEssenceMsgSchema>;\n\n/** 精华消息依赖(OneBotApi 视图,由装配方注入)。 */\nexport type EssenceMsgDeps = Pick<OneBotApi, \"groupApi\" | \"messageUnique\">;\n\n/** 设置精华消息(P2-10 接 kernel addGroupEssence)。 */\nexport class SetEssenceMsgAction extends BaseAction<SetEssenceMsgPayload, null> {\n readonly name = \"set_essence_msg\";\n readonly schema = setEssenceMsgSchema;\n protected readonly errorCodeMap = ob11ErrorCodeMap;\n\n private readonly deps: EssenceMsgDeps;\n\n constructor(deps: EssenceMsgDeps) {\n super();\n this.deps = deps;\n }\n\n protected async _handle(payload: SetEssenceMsgPayload): 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.deps.groupApi.addGroupEssence(peer.peerUid, msgId);\n return null;\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, kernelError, NTGroupMemberRole } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.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 uidMap = await this.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} 的 uid 解析失败`, \"INVALID_PARAM\");\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, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.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 uidMap = await this.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} 的 uid 解析失败`, \"INVALID_PARAM\");\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, kernelError } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.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 uidMap = await this.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} 的 uid 解析失败`, \"INVALID_PARAM\");\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 * 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 { 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 { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.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 视图,由装配方注入)。 */\nexport type ForwardSingleMsgDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\" | \"uinToUid\">;\n\n/** 解析目标 Peer(group_id 直通;user_id 经 uin→uid)。 */\nasync function resolveTargetPeer(\n payload: ForwardSingleMsgPayload,\n deps: ForwardSingleMsgDeps,\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(\"单条转发需要 group_id 或 user_id\", \"INVALID_PARAM\");\n}\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(payload, this.deps);\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 * 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\";\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 = z.object({\n enabled: z.boolean().default(false),\n host: z.string().default(\"127.0.0.1\"),\n port: z.number().int().default(DEFAULT_HTTP_PORT),\n /** 实例级 token,覆盖全局 token(缺省继承全局)。 */\n token: z.string().optional(),\n});\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 连入)。 */\nconst wsServerSchema = z.object({\n enabled: z.boolean().default(false),\n host: z.string().default(\"127.0.0.1\"),\n port: z.number().int().default(DEFAULT_WS_PORT),\n /** 实例级 token,覆盖全局 token(缺省继承全局)。 */\n token: z.string().optional(),\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 /** 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 * CQ 码编解码(OneBot 11 消息段序列化格式)\n *\n * 纯函数、无 OB11 类型依赖:本文件只处理「文本 ↔ CQ 码片段」的通用编解码,\n * segment 级别的映射在 data.ts(OB11Constructor)。\n *\n * 转义规则(OneBot 11 规范):\n * - 纯文本:& → &,[ → [,] → ]\n * - 参数值:额外 , → ,\n */\n\n/** CQ 码片段正则([CQ:xxx] 或 [CQ:xxx,k=v,...])。 */\nconst CQ_CODE_REGEX = /\\[CQ:[^\\]]*\\]/g;\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(\"&\", \"&\").replaceAll(\"[\", \"[\").replaceAll(\"]\", \"]\");\n}\n\n/** 转义 CQ 码参数值(& [ ] ,)。 */\nexport function escapeCqParam(value: string): string {\n return escapeCqText(value).replaceAll(\",\", \",\");\n}\n\n/** 反转义(, ] [ &;& 必须最后解,避免二次转义误伤)。 */\nexport function unescapeCqText(text: string): string {\n return text\n .replaceAll(\",\", \",\")\n .replaceAll(\"]\", \"]\")\n .replaceAll(\"[\", \"[\")\n .replaceAll(\"&\", \"&\");\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/** 解析一条消息文本 → 文本片段与 CQ 码片段的混合数组(文本已反转义)。 */\nexport function parseCqMessage(text: string): Array<string | CqCode> {\n const parts: Array<string | CqCode> = [];\n let lastIndex = 0;\n for (const match of text.matchAll(CQ_CODE_REGEX)) {\n const index = match.index ?? 0;\n if (index > lastIndex) {\n parts.push(unescapeCqText(text.slice(lastIndex, index)));\n }\n parts.push(parseCqCode(match[0] ?? \"\"));\n lastIndex = index + match[0].length;\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 * OB11Constructor:canonical 元素 ↔ OB11 segment / CQ 码(ADR-008 翻译层)\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 { type CqCode, encodeCqCode, escapeCqText, parseCqMessage } 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(null = OB11 无法表达,跳过)。 */\nfunction canonicalToSegment(el: CanonicalElement): OB11MessageSegment | null {\n if (el.type === \"text\") {\n return { type: \"text\", data: { text: el.text } };\n }\n if (el.type === \"at\") {\n return { type: \"at\", data: atData(el.target, el.display) };\n }\n if (el.type === \"image\") {\n return { type: \"image\", data: mediaData(el.path, el.url) };\n }\n if (el.type === \"face\") {\n return { type: \"face\", data: { id: el.id } };\n }\n if (el.type === \"voice\") {\n return { type: \"record\", data: mediaData(el.path, el.url) };\n }\n if (el.type === \"video\") {\n return { type: \"video\", data: mediaData(el.path, el.url) };\n }\n if (el.type === \"reply\") {\n return { type: \"reply\", data: { id: el.messageId } };\n }\n if (el.type === \"forward\") {\n return { type: \"forward\", data: { id: el.messageIds[0] ?? \"\" } };\n }\n if (el.type === \"json\") {\n return { type: \"json\", data: { data: rawToString(el.raw) } };\n }\n if (el.type === \"xml\") {\n return { type: \"xml\", data: { data: rawToString(el.raw) } };\n }\n // file / unknown:OB11 无对应消息段,跳过\n return null;\n}\n\n/** OB11 segment → canonical 元素。 */\nfunction segmentToCanonical(seg: OB11MessageSegment): CanonicalElement | null {\n if (seg.type === \"text\" || seg.type === \"string\") {\n return { type: \"text\", text: seg.data.text };\n }\n if (seg.type === \"at\") {\n return canonicalAt(seg.data.qq, seg.data.name);\n }\n if (seg.type === \"face\") {\n return { type: \"face\", id: seg.data.id };\n }\n if (seg.type === \"image\") {\n return canonicalMedia(\"image\", seg.data.file, seg.data.url);\n }\n if (seg.type === \"record\") {\n return canonicalMedia(\"voice\", seg.data.file, seg.data.url);\n }\n if (seg.type === \"video\") {\n return canonicalMedia(\"video\", seg.data.file, seg.data.url);\n }\n if (seg.type === \"reply\") {\n return { type: \"reply\", messageId: seg.data.id };\n }\n if (seg.type === \"forward\") {\n return { type: \"forward\", messageIds: [seg.data.id] };\n }\n if (seg.type === \"json\") {\n return { type: \"json\", raw: seg.data.data };\n }\n return { type: \"xml\", raw: seg.data.data };\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 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 段,往返不丢数据)。 */\nfunction 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/** 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/** 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/**\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 */\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}\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/**\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 const uid = ctx.uinToUid?.get(el.target);\n out.push(uid !== undefined ? { ...el, target: uid } : el);\n continue;\n }\n if (el.type === \"reply\") {\n const num = Number(el.messageId);\n if (!Number.isNaN(num)) {\n const msgId = ctx.ob11IdToMsgId?.(num);\n if (msgId !== undefined) {\n out.push({ ...el, messageId: msgId });\n continue;\n }\n }\n out.push(el);\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 sender.role = \"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)\n *\n * NT QQ 中群成员变动/撤回等系统事件通过**消息的灰色提示元素(grayTip)**广播。\n * 本模块把 RawMessage 里的 grayTip 翻译为 OB11 notice 事件(纯函数,ADR-008)。\n *\n * 支持:\n * - group_recall(撤回,grayTip.subElementType=REVOKE)\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 *\n * user_id/operator_id 都是 uin:接收 uidToUin Map(调用方批量转换后传入,保持纯函数)。\n */\nimport { GrayTipSubType, type RawMessage, TipGroupElementType } from \"@napuketto/kernel\";\nimport type {\n OB11Event,\n OB11GroupAdminNoticeEvent,\n OB11GroupBanNoticeEvent,\n OB11GroupDecreaseNoticeEvent,\n OB11GroupIncreaseNoticeEvent,\n OB11GroupRecallNoticeEvent,\n} from \"../event/index.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\n\n/** grayTip 翻译上下文(uid→uin 映射,调用方批量转换)。 */\nexport interface NoticeTranslateContext {\n selfUin: string;\n uidToUin: Map<string, string>;\n}\n\n/** 检查消息是否含可翻译的 grayTip 元素。 */\nexport function hasGrayTip(msg: RawMessage): boolean {\n return msg.elements.some((el) => el.grayTipElement !== undefined);\n}\n\n/** 收集 grayTip 涉及的 uid(批量 uidToUin 用)。 */\nexport function collectGrayTipUids(msg: RawMessage): string[] {\n const uids = new Set<string>();\n for (const el of msg.elements) {\n const g = el.grayTipElement;\n if (g === undefined) {\n continue;\n }\n const revoke = g.revokeElement;\n if (revoke?.operatorUid !== undefined && revoke.operatorUid !== \"\") {\n uids.add(revoke.operatorUid);\n }\n const grp = g.groupElement;\n if (grp === undefined) {\n continue;\n }\n if (grp.memberUid !== undefined && grp.memberUid !== \"\") {\n uids.add(grp.memberUid);\n }\n if (grp.adminUid !== undefined && grp.adminUid !== \"\") {\n uids.add(grp.adminUid);\n }\n if (grp.shutUp?.admin?.uid !== undefined && grp.shutUp.admin.uid !== \"\") {\n uids.add(grp.shutUp.admin.uid);\n }\n if (grp.shutUp?.member?.uid !== undefined && grp.shutUp.member.uid !== \"\") {\n uids.add(grp.shutUp.member.uid);\n }\n }\n return [...uids];\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/** 撤回事件(group_recall)。 */\nfunction toRecall(\n msg: RawMessage,\n g: NonNullable<RawMessage[\"elements\"]>[number][\"grayTipElement\"],\n ctx: NoticeTranslateContext,\n): OB11GroupRecallNoticeEvent | null {\n if (g?.revokeElement === undefined) {\n return null;\n }\n const revoke = g.revokeElement;\n const event: OB11GroupRecallNoticeEvent = {\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 return event;\n}\n\n/** 群成员变动(group_increase / group_decrease / group_admin / group_ban)。 */\nfunction toGroupChange(\n msg: RawMessage,\n g: NonNullable<RawMessage[\"elements\"]>[number][\"grayTipElement\"],\n ctx: NoticeTranslateContext,\n):\n | OB11GroupIncreaseNoticeEvent\n | OB11GroupDecreaseNoticeEvent\n | OB11GroupAdminNoticeEvent\n | OB11GroupBanNoticeEvent\n | null {\n const grp = g?.groupElement;\n if (grp === undefined || grp.type === undefined) {\n return null;\n }\n const groupId = Number(msg.peerUid);\n const time = Math.floor(Number(msg.msgTime) / MS_TO_SEC);\n const selfId = Number(ctx.selfUin);\n const memberUid = grp.memberUid ?? \"\";\n const adminUid = grp.adminUid ?? \"\";\n switch (grp.type) {\n case TipGroupElementType.MEMBER_ADD: {\n const event: OB11GroupIncreaseNoticeEvent = {\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 return event;\n }\n case TipGroupElementType.QUIT: {\n const event: OB11GroupDecreaseNoticeEvent = {\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 return event;\n }\n case TipGroupElementType.BLOCK:\n case TipGroupElementType.UNBLOCK: {\n const event: OB11GroupAdminNoticeEvent = {\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 return event;\n }\n case TipGroupElementType.SHUT_UP: {\n const shutUp = grp.shutUp;\n const event: OB11GroupBanNoticeEvent = {\n time,\n self_id: selfId,\n post_type: \"notice\",\n notice_type: \"group_ban\",\n sub_type: Number(shutUp?.duration ?? 0) > 0 ? \"ban\" : \"lift_ban\",\n group_id: groupId,\n operator_id: toUin(shutUp?.admin?.uid ?? adminUid, ctx),\n user_id: toUin(shutUp?.member?.uid ?? memberUid, ctx),\n duration: Number(shutUp?.duration ?? 0),\n };\n return event;\n }\n default:\n return null;\n }\n}\n\n/** RawMessage → OB11 notice 事件(无 grayTip 返回 null)。 */\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 subType = g.subElementType;\n if (subType === GrayTipSubType.REVOKE) {\n const recall = toRecall(msg, g, ctx);\n if (recall !== null) {\n return recall;\n }\n }\n if (subType === GrayTipSubType.GROUP) {\n const change = toGroupChange(msg, g, ctx);\n if (change !== null) {\n return change;\n }\n }\n }\n return null;\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 动作:获取私聊历史消息(NapCat 扩展,P2-10)\n *\n * user_id → uin→uid → Peer{ C2C } → fetchMessages → 数组翻译。\n */\n\nimport { ChatType, kernelError, toCanonicalElements } from \"@napuketto/kernel\";\nimport { z } from \"zod\";\nimport { BaseAction } from \"../../../core/index.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 type { MsgHistoryDeps } from \"./get-group-msg-history.js\";\n\n/** 默认历史消息条数。 */\nconst DEFAULT_HISTORY_COUNT = 20;\n\nconst getFriendMsgHistorySchema = z.object({\n user_id: z.number(),\n message_seq: z.union([z.number(), z.string()]).optional(),\n count: z.number().default(DEFAULT_HISTORY_COUNT),\n reverse_order: z.boolean().optional(),\n reverseOrder: z.boolean().optional(),\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 uidMap = await this.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 const peer = { chatType: ChatType.C2C, peerUid: uid };\n let startMsgId: string | undefined;\n if (payload.message_seq !== undefined) {\n const raw = String(payload.message_seq);\n const shortId = Number(raw);\n if (Number.isFinite(shortId)) {\n startMsgId = this.deps.messageUnique.getMsgId(shortId);\n }\n startMsgId ??= raw;\n }\n const opts: { count: number; msgId?: string } = { count: payload.count };\n if (startMsgId !== undefined) {\n opts.msgId = startMsgId;\n }\n const msgs = await this.deps.msgApi.fetchMessages(peer, opts);\n if (msgs.length === 0) {\n throw kernelError(`消息 ${payload.message_seq ?? \"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 this.deps.uidToUin([...atUids]);\n } catch {\n // uid 解析失败:at 原样(uid)\n }\n }\n const ctx: ReceiveTranslateContext = {\n ...(uidToUin !== undefined ? { uidToUin } : {}),\n msgIdToOb11Id: (m) => this.deps.messageUnique.getMessageId(m),\n };\n return {\n messages: msgs.map((msg) => toOb11MessageInfo(msg, this.deps.messageUnique, ctx)),\n };\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, kernelError, 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\";\n\n/** 默认历史消息条数。 */\nconst DEFAULT_HISTORY_COUNT = 20;\n\nconst getGroupMsgHistorySchema = z.object({\n group_id: z.number(),\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});\n\ntype GetGroupMsgHistoryPayload = z.infer<typeof getGroupMsgHistorySchema>;\n\n/** 历史消息依赖(OneBotApi 视图,由装配方注入)。 */\nexport type MsgHistoryDeps = Pick<OneBotApi, \"msgApi\" | \"messageUnique\" | \"uidToUin\">;\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 // message_seq 为 OB11 message_id(int32)时经 MessageUnique 反查起始 msgId\n let startMsgId: string | undefined;\n if (payload.message_seq !== undefined) {\n const raw = String(payload.message_seq);\n const shortId = Number(raw);\n if (Number.isFinite(shortId)) {\n startMsgId = this.deps.messageUnique.getMsgId(shortId);\n }\n startMsgId ??= raw;\n }\n const opts: { count: number; msgId?: string } = { count: payload.count };\n if (startMsgId !== undefined) {\n opts.msgId = startMsgId;\n }\n const msgs = await this.deps.msgApi.fetchMessages(peer, opts);\n if (msgs.length === 0) {\n throw kernelError(`消息 ${payload.message_seq ?? \"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 this.deps.uidToUin([...atUids]);\n } catch {\n // uid 解析失败:at 原样(uid)\n }\n }\n const ctx: ReceiveTranslateContext = {\n ...(uidToUin !== undefined ? { uidToUin } : {}),\n msgIdToOb11Id: (m) => this.deps.messageUnique.getMessageId(m),\n };\n return {\n messages: msgs.map((msg) => toOb11MessageInfo(msg, this.deps.messageUnique, ctx)),\n };\n }\n}\n","/**\n * get_image / get_record 动作:获取图片/语音文件信息(P2-14,简化版)\n *\n * message_id 反查 → fetchMsgsByMsgId → 找 PIC/PTT 元素 → 返回元素已有路径与 URL。\n * 不做主动下载/转码(NapCat 走 downloadRichMedia 事件驱动下载,待后续接入)。\n */\nimport { kernelError, type RawElement } 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 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<OneBotApi, \"msgApi\" | \"messageUnique\">;\n\n/** 从消息元素提取媒体路径与 URL(PIC/PTT,纯函数)。 */\nfunction extractMediaPath(element: RawElement): { path?: string; url?: string } {\n const pic = element.picElement;\n if (pic !== undefined) {\n const out: { path?: string; url?: string } = {};\n const path = pic.sourcePath ?? pic.picPath;\n if (path !== undefined) {\n out.path = path;\n }\n if (pic.picUrl !== undefined) {\n out.url = pic.picUrl;\n }\n return out;\n }\n const ptt = element.pttElement;\n if (ptt !== undefined && ptt.filePath !== undefined) {\n return { path: ptt.filePath };\n }\n return {};\n}\n\n/** 获取图片信息(P2-14)。 */\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 _handle(payload: GetMediaPayload): Promise<MediaInfoResult> {\n return this.resolveMedia(payload, \"图片\", \"get_image\");\n }\n\n /** 反查消息并提取媒体元素路径。 */\n private async resolveMedia(\n payload: GetMediaPayload,\n label: string,\n actionName: string,\n ): Promise<MediaInfoResult> {\n const id = payload.message_id ?? payload.file;\n if (id === undefined) {\n throw kernelError(`${actionName} 需要 message_id 或 file`, \"INVALID_PARAM\");\n }\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 let found: { path?: string; url?: string } | undefined;\n for (const el of first.elements) {\n const media = extractMediaPath(el);\n if (media.path !== undefined || media.url !== undefined) {\n found = media;\n break;\n }\n }\n if (found === undefined) {\n throw kernelError(`消息 ${id} 不包含${label}`, \"NOT_FOUND\");\n }\n const result: MediaInfoResult = {};\n if (found.path !== undefined) {\n result.file = found.path;\n }\n if (found.url !== undefined) {\n result.url = found.url;\n }\n return result;\n }\n}\n\n/** 获取语音信息(P2-14)。 */\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 = payload.message_id ?? payload.file;\n if (id === undefined) {\n throw kernelError(\"get_record 需要 message_id 或 file\", \"INVALID_PARAM\");\n }\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 for (const el of first.elements) {\n const ptt = el.pttElement;\n if (ptt !== undefined && ptt.filePath !== undefined) {\n return { file: ptt.filePath };\n }\n }\n throw kernelError(`消息 ${id} 不包含语音`, \"NOT_FOUND\");\n }\n}\n","/**\n * get_msg 动作:获取消息详情(P2-10 接 kernel MsgApi.fetchMsgsByMsgId)\n *\n * message_id → msgId + peer(MessageUnique 反查)→ 拉消息 → OB11 消息信息结构。\n */\n\nimport { kernelError, 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 { resolveMsgIdAndPeer } from \"../../helper/message-unique.js\";\nimport type { OB11MessageInfo } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.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<OneBotApi, \"msgApi\" | \"messageUnique\" | \"uidToUin\">;\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 { msgId, peer } = resolveMsgIdAndPeer(payload.message_id, this.deps.messageUnique);\n const msgs = await this.deps.msgApi.fetchMsgsByMsgId(peer, [msgId]);\n const [msg] = msgs;\n if (msg === undefined) {\n throw kernelError(`消息 ${payload.message_id} 不存在或已被撤回`, \"NOT_FOUND\");\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 const ctx: ReceiveTranslateContext = {\n ...(uidToUin !== undefined ? { uidToUin } : {}),\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, 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 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 uidMap = await this.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 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, 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 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 uidMap = await this.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 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\";\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/** 发送群合并转发(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 sources = resolveSourceMessages(payload.messages, this.deps.messageUnique);\n const [firstSource] = sources;\n if (firstSource === undefined) {\n throw kernelError(\"合并转发需要至少一条可解析的源消息(node.id)\", \"INVALID_PARAM\");\n }\n const target: Peer = { chatType: ChatType.GROUP, peerUid: String(payload.group_id) };\n const { msgId } = await this.deps.msgApi.sendForwardMessage(\n target,\n firstSource.peer,\n sources.map((s) => s.msgId),\n );\n return { message_id: this.deps.messageUnique.alloc(msgId, target) };\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 sources = resolveSourceMessages(payload.messages, this.deps.messageUnique);\n const [firstSource] = sources;\n if (firstSource === undefined) {\n throw kernelError(\"合并转发需要至少一条可解析的源消息(node.id)\", \"INVALID_PARAM\");\n }\n const uidMap = await this.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 const target: Peer = { chatType: ChatType.C2C, peerUid: uid };\n const { msgId } = await this.deps.msgApi.sendForwardMessage(\n target,\n firstSource.peer,\n sources.map((s) => s.msgId),\n );\n return { message_id: this.deps.messageUnique.alloc(msgId, target) };\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, 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 { applySendContext, cqMessageToCanonical, segmentsToCanonical } from \"../../helper/index.js\";\nimport type { OB11MessageSegment } from \"../../types/index.js\";\nimport { ob11ErrorCodeMap } from \"../error-map.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(group_id 直通;user_id 经 uin→uid)。 */\nasync function resolvePeer(payload: SendMsgPayload, deps: SendMsgDeps): 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 // 2026-08-07:抛类型化 KernelError(INVALID_PARAM=105),\n // 此前普通 Error → retcode 999(UNKNOWN)\n throw kernelError(`用户 ${payload.user_id} 的 uid 解析失败`, \"INVALID_PARAM\");\n }\n return { chatType: ChatType.C2C, peerUid: uid };\n }\n throw kernelError(\"send_msg 需要 group_id 或 user_id\", \"INVALID_PARAM\");\n}\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 resolvePeer(payload, deps);\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 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,&、[、]、, 前置 &)。 */\nfunction escapeText(text: string): string {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"[\", \"[\")\n .replaceAll(\"]\", \"]\")\n .replaceAll(\",\", \",\");\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, 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 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 uidMap = await this.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 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 { 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 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 { msgId, peer } = resolveMsgIdAndPeer(payload.message_id, this.deps.messageUnique);\n // msgSeq 需从消息本体取\n const msgs = await this.deps.msgApi.fetchMsgsByMsgId(peer, [msgId]);\n const [msg] = msgs;\n if (msg === undefined) {\n throw kernelError(`消息 ${payload.message_id} 不存在或已被撤回`, \"NOT_FOUND\");\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 */\nimport { ActionRegistry } from \"../../core/index.js\";\nimport type { OneBotApi } from \"../api/one-bot-api.js\";\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.groupApi));\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 * 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 GroupApi,\n GroupCache,\n GroupNotifyApi,\n MsgApi,\n ProfileApi,\n ProfileLikeApi,\n RichMediaApi,\n TicketApi,\n WebApi,\n} from \"@napuketto/kernel\";\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 保存路径)。 */\n cacheDir?: 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 /** 进程退出回调(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.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 * 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 role: \"member\", // P2-3: 接 kernel cache 判定 owner/admin\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 传输装配(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/config.js\";\n\n/** Authorization 头前缀。 */\nconst BEARER_PREFIX = \"Bearer \";\n\n/** 校验 URL 查询参数里的 access_token(WS client 连接 URL 可能带)。 */\nfunction hasAccessTokenQuery(url: string, token: string): boolean {\n try {\n const parsed = new URL(url);\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}\n\n/** 按配置装配 OB11 传输。 */\nexport function assembleOb11Transports(opts: AssembleOb11TransportsOptions): Ob11TransportSet {\n const { config, broadcaster, handleRequest } = opts;\n const servers: TransportAdapter[] = [];\n const transports: TransportAdapter[] = [];\n\n assembleHttpServers(config, handleRequest, servers);\n assembleWsServers(config, handleRequest, servers);\n assembleHttpPosts(config, transports);\n assembleWsReverses(config, 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(config: OB11Config, transports: TransportAdapter[]): void {\n for (const item of config.httpPostUrls) {\n if (item.enabled && item.url !== undefined) {\n const headers = authorizeHeader(item.token ?? config.token);\n const options: ConstructorParameters<typeof HttpClient>[0] = {\n url: item.url,\n };\n if (headers !== undefined) {\n options.headers = 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 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 const headers = authorizeHeader(item.token ?? config.token);\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 heartbeat: { intervalMs: item.heartbeatInterval },\n reconnect,\n rejectUnauthorized: item.rejectUnauthorized,\n };\n if (headers !== undefined) {\n options.headers = headers;\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 { MsgEventChannel, RawMessage } from \"@napuketto/kernel\";\nimport { 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 { createOb11ActionRegistry } from \"./action/index.js\";\nimport type { OneBotApiOptions } from \"./api/one-bot-api.js\";\nimport { OneBotApi } from \"./api/one-bot-api.js\";\nimport type { OB11Config } from \"./helper/index.js\";\nimport {\n collectReceiveNeeds,\n ob11ConfigSchema,\n type ReceiveTranslateContext,\n} from \"./helper/index.js\";\nimport { toOb11MessageEvent } from \"./helper/message-event.js\";\nimport { collectGrayTipUids, hasGrayTip, toOb11NoticeEvent } from \"./helper/notice.js\";\nimport type { Ob11TransportSet } from \"./transport.js\";\nimport { assembleOb11Transports } from \"./transport.js\";\n\n/** 毫秒 → 秒(Unix 时间戳)。 */\nconst MS_TO_SEC = 1000;\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}\n\n/** OneBot 11 协议适配器。 */\nexport class NapukettoOneBot11Adapter extends BaseProtocolAdapter<OB11Config> {\n readonly protocol = \"onebot11\";\n readonly configSchema = ob11ConfigSchema;\n\n private readonly msgChannel: MsgEventChannel;\n private readonly selfUin: string;\n private readonly oneBotApi: OneBotApi;\n private readonly registry: ActionRegistry;\n private unsubscribe: (() => void) | null = null;\n private transports: Ob11TransportSet | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private reportSelfMessage = false;\n private messageFormat: \"array\" | \"string\" = \"array\";\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: () => {\n // P2-6:配置热更新重建传输\n return Promise.resolve();\n },\n },\n });\n this.msgChannel = opts.msgChannel;\n this.selfUin = opts.self.uin;\n this.oneBotApi = new OneBotApi(opts);\n this.registry = createOb11ActionRegistry({ api: this.oneBotApi });\n }\n\n /** 启动传输:装配(HTTP/WS)+ 打开 server/client + 广播 lifecycle enable + 起心跳。 */\n private async startTransports(config: OB11Config): Promise<void> {\n // 全局上报开关与消息格式(订阅处消费)\n this.reportSelfMessage = config.reportSelfMessage;\n this.messageFormat = config.messagePostFormat;\n const broadcaster = this.getBroadcaster();\n if (broadcaster !== undefined) {\n this.transports = assembleOb11Transports({\n config,\n broadcaster,\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.unsubscribe !== null) {\n return;\n }\n // onRecvMsg 回调参数为消息数组(2026-08-07 运行时实证)——遍历逐条翻译。\n this.unsubscribe = this.msgChannel.on(\"Msg/onRecvMsg\", (msgs) => {\n const list = Array.isArray(msgs) ? msgs : [msgs];\n for (const msg of list) {\n if (!msg || typeof msg !== \"object\") {\n continue;\n }\n // grayTip(系统事件)→ notice;否则 → 消息事件\n if (hasGrayTip(msg)) {\n this.broadcastNotice(msg).catch(() => {\n // notice 翻译失败静默(grayTip 解析宽容)\n });\n continue;\n }\n // 自身消息:默认不上报(OB11 规范行为;reportSelfMessage=true 时上报)\n if (!this.reportSelfMessage && String(msg.senderUin) === this.selfUin) {\n continue;\n }\n void this.broadcastMessageEvent(msg);\n }\n });\n }\n\n /**\n * 广播消息事件(P2-19:接收方向 ID 转换)。\n * 收集 at uid → 一次批量 uidToUin → 构造上下文 → 翻译广播。\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 ctx: ReceiveTranslateContext = {\n ...(uidToUin !== undefined ? { uidToUin } : {}),\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, { selfUin: this.selfUin, uidToUin });\n if (notice !== null) {\n this.broadcastEvent(notice);\n }\n }\n\n /** 退订(幂等)。 */\n private unsubscribeAll(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\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 const { action: rawAction, params, echo } = parsed;\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"],"mappings":"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"}
|