/** 命令正则必须带 `\b` 边界、不带 g 标志(exec/index 语义依赖)。 */ export type CommandPattern = RegExp; /** * `openId`:mention 的 open_id(可能为空——飞书用 `{id_type:'app_id', id:'cli_xxx'}` * 形态标识**群外 bot**,此时无 open_id,见 message-parser 的 mentionOpenId 注释)。 * `appId`:mention 的 app_id(仅 app_id 形态 mention 才有)。 * 二者至少有一个非空该 target 才被收录(/invite 拉群外 bot 主场景恰恰只有 appId)。 * /grant 只消费 openId(授权对象必须是 open_id 主体),app_id-only 目标由 * parseGrantTargets 过滤掉——grant 行为与历史 byte-parity(app_id 形态过去被 * mentionOpenId 直接 drop,本就不在 grant 目标里)。 */ export interface MentionTarget { openId: string; name: string; appId?: string; } /** * 从 mention 列表取「cmdPattern 匹配的命令词之后」出现的所有非本 bot @,按 * open_id 去重、保持 @ 顺序(支持一次命令带多目标)。 */ export declare function parseTargetsAfterCommand(message: any, botOpenId: string | undefined, cmdPattern: CommandPattern): MentionTarget[]; /** * 本 bot 是否「只是作为命令的目标」被 @(@ 出现在命令词之后),而不是被前导 @ * 点名执行命令的操作 bot。命中(仅目标)返回 true,调用方应静默放手——否则 * 目标 bot 会误回 owner_only / 把自己剔空后误执行。 * * 本 bot 的身份判据要**同时**认 open_id 与 app_id:飞书对「群外 / 协作 bot」的 @ * 常以 `{id_type:'app_id', id:'cli_xxx'}` 形态下发(无 open_id),只认 open_id 会 * 漏判 `@OperatorBot /cmd @ThisBot(app_id 形态)` → guard 不命中 → 目标 bot 误回 * owner_only / 已在群(实测 blocker,2026-07 /invite app_id 支持)。botAppId 即本 * bot 的 larkAppId(app_id 形态自我识别用)。 * * text 与 post(富文本)两种消息形态都覆盖(同 parseTargetsAfterCommand): * - text:{"text":"@_user_1 /cmd @_user_2"},@ 是占位符 key;用「key 后不接数字」 * 的边界锁定整 token,规避 @_user_1 / @_user_10 这类 key 前缀歧义。 * - post:@ 是独立的 `at` 节点(不在 text 里、mentions 可能为空),按文档节点 * 顺序比较本 bot 的 `at` 节点与含命令词的 text 节点的先后。 */ export declare function isCommandTargetOnly(message: any, botOpenId: string | undefined, cmdPattern: CommandPattern, botAppId?: string): boolean; /** 把文本里所有 `@` mention token 去掉(split/join,防正则注入),归一空白后 trim。 */ export declare function stripAllMentions(text: string, mentions: any[]): string; export declare function escapeRe(s: string): string; //# sourceMappingURL=mention-targets.d.ts.map