import { type BlockContext } from "../blocks/block-context.js"; import type { FeedBlock } from "./feed-blocks.js"; /** Rows an open assistant block keeps when it does not fit (03-RENDER-MODEL §6). */ export declare const ASSISTANT_LIVE_ROWS = 12; /** Output rows kept from an open tool body, on top of the header row. */ export declare const TOOL_LIVE_BODY_ROWS = 8; /** Hunk rows kept from an open diff body, on top of the header row. */ export declare const DIFF_LIVE_HUNK_ROWS = 8; export interface BoundedBlock { readonly lines: readonly string[]; readonly truncated: boolean; } /** * Bound an open block to the rows the live region can give it. The bounded form * never reaches scrollback — the committed copy is always the complete one. */ export declare function boundOpenBlock(ctx: BlockContext, block: FeedBlock, budget: number): BoundedBlock; export interface LiveTailRow { readonly key: string; readonly block: FeedBlock; readonly lines: readonly string[]; } export interface LiveTailPlan { readonly rows: readonly LiveTailRow[]; /** Rows the plan occupies; always `<= budget`. */ readonly height: number; /** True when content above the first visible row was dropped. */ readonly clipped: boolean; readonly hiddenAbove: number; } /** * Fit live blocks into exactly the rows the allocator granted, newest last. * Pure so `frame-height` and invariant tests can assert it without Ink. */ export declare function planLiveTail(ctx: BlockContext, live: readonly FeedBlock[], budget: number): LiveTailPlan;