import type { StreamFn } from "@mariozechner/pi-agent-core";
/**
 * 单条替换规则定义。
 *
 * 匹配逻辑（所有指定字段都满足才算命中）：
 *  - contentPattern: tool content 中包含的正则模式（字符串，会编译为 RegExp）
 *  - commandPattern: 对应 assistant tool_call 的 arguments.command 正则模式
 *                    注意：仅匹配 arguments.command 字段，不回退到 rawArguments，
 *                    这样 read/write 等非 exec 工具不会因路径中包含关键字而被误匹配
 *  - toolName:       对应 assistant tool_call 的 function.name 完全匹配（大小写不敏感）
 *
 * 替换控制：
 *  - keepLast:          最后 N 条命中的 tool 消息保留原始内容，不做替换（默认 1）
 *                       当 ToolResultRulesConfig.sharedKeepLast 启用时，此字段被忽略。
 *  - minContentLength:  原始内容最小字符数，低于此阈值的内容不替换（避免短内容替换后反而变长）
 *  - replacement:       替换文本模板，支持占位符：
 *                         {action_result} - Action result 行
 *                         {current_page}  - Current page 行
 *                         {char_count}    - 原始内容字符数
 *                         {tool_call_id}  - tool_call_id
 */
export type ToolResultRule = {
    /** 规则名称，仅用于日志 */
    name?: string;
    /** tool content 内容正则模式 */
    contentPattern?: string;
    /** assistant tool_call 的 arguments.command 正则模式（仅匹配 command 字段，不回退到 rawArguments） */
    commandPattern?: string;
    /** assistant tool_call 的 function.name 精确匹配（大小写不敏感） */
    toolName?: string;
    /** 最后 N 条命中的 tool 消息保留不替换，默认 1（sharedKeepLast 启用时被忽略） */
    keepLast?: number;
    /** 原始内容最小字符数，低于此阈值的内容不替换（避免短内容替换后反而变长） */
    minContentLength?: number;
    /** 替换文本模板 */
    replacement: string;
};
export type ToolResultRulesConfig = {
    /** 是否启用替换规则（默认 true，配置文件存在即启用） */
    enabled?: boolean;
    /**
     * 所有规则共享的 keepLast 计数。
     * 设置后，所有规则命中的消息合并去重，统一保留最后 N 条不替换。
     * 未设置时，每条规则各自独立使用自身的 keepLast（向后兼容）。
     */
    sharedKeepLast?: number;
    /**
     * 二级替换：保留最后 N 条使用详细摘要，更早的替换为极简一句话。
     *
     * 三级保留策略：
     *  - 最后 sharedKeepLast 条：完整保留原始内容
     *  - 倒数 sharedKeepLast+1 ~ aggressiveKeepLast 条：使用详细摘要（保留结构化元信息）
     *  - 更早的：替换为极简一句话（仅保留 Action Result 和原始大小）
     *
     * 未设置时不启用二级替换，所有被替换的消息都使用详细摘要。
     */
    aggressiveKeepLast?: number;
    /**
     * 二级替换的极简模板。
     * 支持占位符：{action_result}、{current_page}、{char_count}、{tool_call_id}
     * 默认模板："[compacted: older browser result]"
     */
    aggressiveReplacement?: string;
    rules: ToolResultRule[];
};
/** 判断 tool result 内容是否已经被摘要/压缩替换过 */
export declare function isAlreadySummarized(text: string): boolean;
/**
 * 获取生效的替换规则配置。
 * 直接返回内置默认规则。
 */
export declare function resolveToolResultRules(): ToolResultRulesConfig;
/**
 * 从 tool content 中提取 [RESULT] JSON 的 text 字段内容。
 *
 * qqbrowser-skill 的输出格式为：
 *   [RESULT] { "text": "Action result: ...\n\nState of current webpage..." }
 *
 * 其中 text 字段包含了 Action result、Current page 等关键信息，
 * 但这些信息以 JSON 字符串转义的形式存在（\\n 而非真实换行）。
 *
 * 本函数提取 text 字段并将 \\n 转义还原为真实换行，
 * 使后续的正则匹配能正常工作。
 */
export declare function extractResultJsonText(content: string): string | null;
/** 从 tool content 中提取 Action result 行（统一从 [RESULT] JSON text 字段解析） */
export declare function extractActionResult(content: string): string;
/** 从 tool content 中提取 Current page 行（统一从 [RESULT] JSON text 字段解析） */
export declare function extractCurrentPage(content: string): string;
/**
 * 提取 Current page: 行的下一行开始的内容（最多 maxLen 个字符）。
 *
 * 用于在摘要中保留页面正文的开头部分，帮助模型理解当前页面的实际内容。
 * 判断规则：找到 "Current page:" 所在行，取其下一行开始的文本。
 */
export declare function extractContentAfterCurrentPage(content: string, maxLen?: number): string;
/**
 * 从 tool content 中提取页面内容摘要。
 *
 * 采用结构化提取策略：
 *  1. 完整保留 Tab infos、Previous page、Action、Action Result、Current page 等关键元信息
 *  2. 丢弃 DOM 元素列表（Downloadable resources、Current page elements 等大量内容）
 *  3. 对于非浏览器结构化内容，回退到字符截取模式
 *
 * @param content   原始 tool content
 * @param marker    内容标记的正则模式字符串（如 ">>>>> Page Content"）
 * @param maxLen    回退模式下的最大字符数（默认 500），结构化提取时不受此限制
 */
export declare function extractContentSummary(content: string, marker?: string, maxLen?: number): string;
/**
 * 从消息的 content 字段中提取纯文本。
 * 支持两种格式：
 *  - pi-agent 内部格式：content 是 [{type:"text", text:"..."}] 数组
 *  - OpenAI payload 格式：content 是纯字符串
 */
export declare function extractContentText(content: unknown): string;
/**
 * 从 tool 结果消息中提取 tool_call_id。
 * 支持 pi-agent 内部格式 (toolCallId) 和 OpenAI 格式 (tool_call_id)。
 */
export declare function extractToolCallId(msg: Record<string, unknown>): string;
export type ToolCallInfo = {
    functionName: string;
    arguments: Record<string, unknown>;
    rawArguments?: string;
};
/**
 * 构建 tool_call_id → tool_call 信息 的索引映射。
 * 用于从 tool 消息反查对应的 assistant tool_call 信息（工具名、参数等）。
 *
 * 支持两种 assistant 消息格式：
 *  - pi-agent 内部格式：content 数组中 {type:"toolCall", id, name, arguments}
 *  - OpenAI payload 格式：tool_calls 数组中 {id, function:{name, arguments}}
 */
export declare function buildToolCallIndex(messages: Array<Record<string, unknown>>): Map<string, ToolCallInfo>;
/**
 * 提取内容标记之前的文本。
 * 统一先从 [RESULT] JSON 的 text 字段解析出有效内容，
 * 再根据 contentPattern 找到标记位置，返回标记之前的内容。
 */
export declare function extractContentBeforeMarker(content: string, contentPattern?: string): string;
/** 应用替换模板，替换占位符 */
export declare function applyReplacementTemplate(template: string, toolContent: string, toolCallId: string, contentPattern?: string): string;
/**
 * 对 messages 数组中的 tool 消息应用自定义替换规则。
 *
 * 会 **直接修改** messages 数组中的 tool 消息 content，
 * 从而实际减少发送给模型的 token 数量。
 *
 * @returns 替换的消息数量
 */
export declare function applyToolResultRules(messages: Array<Record<string, unknown>>, rulesConfig: ToolResultRulesConfig): number;
/**
 * 创建一个 streamFn wrapper，在每次调用模型之前对 context.messages
 * 应用 tool 结果替换规则。
 *
 * 内置默认规则直接生效，无需任何额外配置。
 */
export declare function createToolResultRulesWrapper(params: {
    provider?: string;
    modelId?: string;
}): (streamFn: StreamFn) => StreamFn;
