/** * Truncates tool_result content in messages for WebSocket transport. * Cards that are collapsed by default have their large results replaced * with a summary, and clients fetch full content on-demand via API. */ import type { CardExpandDefaults, ContentBlock, ConversationTurn } from "./types.js"; export interface WindowedMessages { /** 已截断 + 窗口化后的 turn 列表(最近 windowSize 条)。 */ messages: ConversationTurn[]; /** messages[0] 在完整历史里的绝对下标(0 表示已含最早一条)。 */ messageOffset: number; /** 完整历史的 turn 总数(客户端据此判断是否还有更早的可加载)。 */ messageTotal: number; } export interface BlockWindowedMessages extends WindowedMessages { /** messages[0] 被切掉的头部块数(0 表示该 turn 完整;>0 表示其更早的块需翻页)。 */ leadingBlockOffset: number; /** turn messageOffset 的完整块数(客户端据此判断该 turn 是否已全部加载)。 */ leadingBlockTotal: number; } /** * 块级窗口:取完整历史「最近 blockBudget 个内容块」并做 transport 截断。 * 从最新 turn 往回累计块数,能整条放下就整条放,放不下的那条(最旧的入窗 turn) * 只取其尾部若干块,并通过 leadingBlockOffset 告知客户端「这条 turn 还有更早的块」。 * 客户端先按块翻完这条 turn 的头部,再按 turn 往前翻更早的整条。 */ export declare function blockWindowMessagesForTransport(all: ConversationTurn[] | undefined, cardDefaults: CardExpandDefaults, blockBudget?: number): BlockWindowedMessages; /** * 块级翻页:取某条 turn 的 content[start, end) 这一段(已做 transport 截断)。 * 客户端滚动到顶、且当前最旧 turn 仍有更早块时调用,end = 客户端当前 leadingBlockOffset。 */ export declare function sliceTurnBlocksForTransport(turn: ConversationTurn, start: number, end: number, cardDefaults: CardExpandDefaults): ContentBlock[]; /** * 取完整历史的「最近 windowSize 条」并对其做 transport 截断,附带 offset/total 元数据。 * 客户端持有的永远是一段连续的「后缀」(最近的若干条),更早的按 offset 往前翻页。 */ export declare function windowMessagesForTransport(all: ConversationTurn[] | undefined, cardDefaults: CardExpandDefaults, windowSize?: number): WindowedMessages; /** * Truncate messages for WebSocket transport. Tool results for collapsed card * types are replaced with a short summary when they exceed the threshold. * * @param messages - Original messages array (not mutated) * @param cardDefaults - Current card expand defaults from config * @param streamingTurnIndex - Index of the currently streaming turn (-1 if none). * Tool results in the streaming turn are never truncated. */ export declare function truncateMessagesForTransport(messages: ConversationTurn[], cardDefaults: CardExpandDefaults, streamingTurnIndex?: number): ConversationTurn[];