/** * API-safe message builder for provider payloads. * * @see PLAN.md §3.1 — moved from `packages/agents/src/context/message-builder.ts`. * @see PLAN.md §3.2.3 — public surface of `MessageBuilder`. * * Walks the conversation to produce provider-ready messages, handling * tool-result truncation and outdated-file-content rewrite for compaction. * Per-instance caches make this host state. */ import { type MediaBudgetOptions, type Message } from "@cline/shared"; export declare const DEFAULT_MAX_TOOL_RESULT_CHARS = 8000; export declare const DEFAULT_MAX_FILE_CONTENT_CHARS = 50000; export declare const DEFAULT_MAX_TOTAL_TEXT_BYTES = 6000000; export declare const DEFAULT_MAX_ASSISTANT_TEXT_CHARS = 200000; export declare const DEFAULT_MAX_ASSISTANT_TOOL_MARKUP_CHARS = 12000; export declare const DEFAULT_MIN_OUTDATED_REWRITE_BYTES = 65536; export declare const MESSAGE_BUILDER_LIMIT_ENV: { readonly maxToolResultChars: "CLINE_MESSAGE_BUILDER_MAX_TOOL_RESULT_CHARS"; readonly maxTotalTextBytes: "CLINE_MESSAGE_BUILDER_MAX_TOTAL_TEXT_BYTES"; readonly minOutdatedRewriteBytes: "CLINE_MESSAGE_BUILDER_MIN_OUTDATED_REWRITE_BYTES"; }; export interface MessageBuilderOptions { maxToolResultChars?: number; maxFileContentChars?: number; maxTotalTextBytes?: number; mediaBudget?: MediaBudgetOptions; maxAssistantTextChars?: number; maxAssistantToolMarkupChars?: number; minOutdatedRewriteBytes?: number; } export declare function getMessageBuilderOptionsFromEnv(env?: Record): MessageBuilderOptions; /** * Builds an API-safe message copy without mutating original conversation history. */ export declare class MessageBuilder { private indexedMessageCount; private indexedTailRef; private readonly toolNameByIdCache; private readonly readLocatorsByToolUseIdCache; private readonly latestReadToolUseByLocatorCache; private readonly latestFullContentOwnerByPathCache; private readResultLocatorCache; private readonly maxToolResultChars; private readonly maxFileContentChars; private readonly maxTotalTextBytes; private readonly mediaBudget; private readonly maxAssistantTextChars; private readonly maxAssistantToolMarkupChars; private readonly minOutdatedRewriteBytes; private readonly committedOutdatedRewrites; constructor(options?: MessageBuilderOptions); resetConversationState(): void; buildForApi(messages: Message[]): Message[]; private transformBlock; private reindex; /** Commits pending stale-read rewrites once reclaimable bytes cross the threshold. */ private commitOutdatedRewrites; /** Estimates reclaimable bytes for stale locators inside one tool-result block. */ private estimateOutdatedReclaimBytes; private providerBoundEntryBytes; private addMissingToolResults; private appendMissingToolResults; private shouldMergeUserAfterToolResults; private contentBlocksForUserMerge; private collectToolResultIds; private isToolResultOnlyMessage; private trackMissingToolCalls; private createMissingToolResultMessage; private createMissingToolResultBlocks; private formatMissingToolResultText; private resetIndexes; private getReadLocators; private extractLocatorsFromReadToolInput; private extractReadLocatorsFromToolResultContent; private tryParseReadLocators; private extractLocatorsFromParsedReadResult; private extractLocatorFromReadRequest; private extractLocatorFromResultEntry; private extractPath; private extractLineNumber; private parseReadQuery; private dedupeReadLocators; private toReadLocatorKey; private isFullFileRead; private isOutdatedReadLocator; private replaceOutdatedReadContent; private countOutdatedImageEntries; private replaceOutdatedInString; private replaceOutdatedReadEntry; private isReadTool; /** * Tool results can outlive their paired tool_use block (compacted or * imported histories), so fall back to the name carried on the result * itself when the id lookup misses. */ private resolveToolName; private truncateToolResultContent; /** * Deep-truncates string values inside structured tool outputs (e.g. * `ToolOperationResult[]` from run_commands/read_files), which carry the * payload in untyped `{query, result, ...}` fields rather than text * blocks. Image blocks are left intact so base64 payloads survive. */ private truncateNestedStrings; private truncateMiddle; private truncateAssistantText; private hasRepeatedToolCallMarkup; private truncateToTotalTextBudget; private countMessageTextBytes; private collectTruncationCandidates; private applyMediaBudget; private resolveMediaBudget; private applyMediaBudgetToBlock; private applyMediaBudgetToToolResultEntry; private limitNestedMedia; private limitImageContent; }