/**
 * bot 回复的隐形哨兵：追加在 bot 发表的评论末尾（零宽字符，用户不可见）。
 *
 * 为什么需要：bot 用 **user_access_token** 发评论 → 评论作者 = 授权用户本人，
 * 无法靠「作者是不是 bot」区分「bot 的回复」和「用户自己的评论」。若不区分，
 * bot 发评论 → 触发 comment_add 事件 → 又喂给 bot → 死循环。
 *
 * 双保险：① 记录 bot 创建过的 reply_id（{@link isBotAuthoredReply}，同一 daemon
 * 生命周期内权威）② 文本末尾哨兵（跨重启 / reply_id 拿不到时的兜底）。
 */
export declare const BOT_REPLY_SENTINEL = "\u200B\u2063\u200B";
export declare function markBotAuthoredReply(id: string): void;
export declare function isBotAuthoredReply(id: string | undefined): boolean;
export declare function hasBotSentinel(text: string | undefined): boolean;
/** 飞书云文档评论里富文本元素的最小子集（够 bot 发纯文本 + @人）。 */
export interface CommentElement {
    type: 'text_run' | 'person' | 'docs_link';
    text_run?: {
        text: string;
    };
    person?: {
        user_id: string;
    };
    docs_link?: {
        url: string;
    };
}
/** 一条评论（含其下回复）的归一化形态，listDocComments 返回。 */
export interface DocComment {
    commentId: string;
    /** 评论是否已解决。 */
    isSolved: boolean;
    /** 该评论 thread 下所有回复（飞书把评论建模成 reply_list）。 */
    replies: Array<{
        replyId: string;
        /** 发表者 open_id（user_id_type=open_id 时）。 */
        userId?: string;
        /** 纯文本内容（拼接所有 text_run）。 */
        text: string;
        /** 该回复 @ 到的 open_id 列表（从 person 元素提取）。 */
        mentions: string[];
        createdAt?: number;
    }>;
}
export interface ResolvedDocFile {
    fileToken: string;
    /** 飞书 file_type：docx / doc / sheet / bitable / file / slides。本特性主攻 docx。 */
    fileType: string;
}
/**
 * 把用户输入解析成 { kind, token }。支持完整飞书链接、`/docx/<token>` 片段、
 * 或裸 token（裸 token 当 docx 处理）。`wiki` 类型需要再过一次节点解析（见
 * {@link resolveDocFile}）。无法识别返回 null。
 */
export declare function parseDocRef(input: string): {
    kind: string;
    token: string;
} | null;
/**
 * 解析成可直接调评论 / 订阅 API 的 { fileToken, fileType }。wiki 节点先调
 * get_node 换出底层 obj_token + obj_type；其余类型直接映射。
 */
export declare function resolveDocFile(larkAppId: string, input: string): Promise<ResolvedDocFile>;
/** 订阅文档事件（评论新增等靠此推送）。幂等：重复订阅飞书返回成功。 */
export declare function subscribeDocFile(larkAppId: string, file: ResolvedDocFile): Promise<void>;
/** 退订文档事件。best-effort：失败只告警不抛。 */
export declare function unsubscribeDocFile(larkAppId: string, file: ResolvedDocFile): Promise<void>;
/**
 * 读某条评论（含其下所有回复）。用于事件来后取 thread 上下文 + 判断是否 @bot。
 * 拿不到返回 null。
 */
export declare function getDocComment(larkAppId: string, file: ResolvedDocFile, commentId: string): Promise<DocComment | null>;
/**
 * 往**已有评论 thread 里追加一条回复**（真正的嵌套回复，用户看到 bot 的回复
 * 就挂在自己那条评论下面）。
 *
 * 端点 `POST .../comments/{comment_id}/replies` 是飞书 drive-v1 的公开 API
 * （file.comment.reply.create）—— 我们装的 node-sdk 1.64.0 恰好没暴露 create，
 * 但裸 endpoint 存在，故这里直接打。返回新回复的 reply_id（已登记防自触发）。
 */
export declare function replyToDocComment(larkAppId: string, file: ResolvedDocFile, commentId: string, text: string, mentionOpenId?: string): Promise<{
    replyId?: string;
    commentId?: string;
}>;
/**
 * 新建一条**全文评论**（独立的新评论，非嵌套）。用于没有可挂靠 comment_id 的
 * 场景（如主动向文档发评论）。返回 comment_id。
 */
export declare function createDocComment(larkAppId: string, file: ResolvedDocFile, text: string, mentionOpenId?: string): Promise<{
    commentId: string;
    replyId?: string;
}>;
/** 飞书文档评论内容长度上限的保守值，超长 bot 回复按此分块发多条评论。 */
export declare const DOC_COMMENT_MAX_CHARS = 3000;
/** 把长文本按 {@link DOC_COMMENT_MAX_CHARS} 切块（尽量按段落/换行边界）。 */
export declare function chunkCommentText(text: string, max?: number): string[];
//# sourceMappingURL=doc-comment.d.ts.map