import type { ConversationViewport } from "../rendering/conversation-viewport.js"; import type { EditorLayoutRenderer } from "../rendering/editor-layout-renderer.js"; import type { Entry, RenderedLine } from "../types.js"; export type AppScrollMetrics = { bodyHeight: number; viewportColumns: number; conversationLineCount: number; maxScroll: number; start: number; }; export type ConversationTextScrollTarget = { entryId?: string; needles: readonly string[]; }; export type AppScrollState = { scrollFromBottom: number; detachedScrollStart?: number; }; export type AppScrollControllerHost = { conversationViewport(): ConversationViewport; editorLayoutRenderer(): EditorLayoutRenderer; terminalColumns(): number; terminalRows(): number; tabPanelRows(terminalRows: number): number; hasOlderSessionHistory?(): boolean; isLoadingOlderSessionHistory?(): boolean; loadOlderSessionHistory?(options?: { render?: boolean; onPrependedEntries?: (entries: readonly Entry[]) => void; }): Promise; hasNewerSessionHistory?(): boolean; isLoadingNewerSessionHistory?(): boolean; loadNewerSessionHistory?(options?: { render?: boolean; }): Promise; render(): void; }; export declare class AppScrollController { private readonly host; private scrollFromBottom; private detachedScrollStart; private readonly olderHistoryThresholdLines; constructor(host: AppScrollControllerHost); reset(): void; scrollToBottom(): boolean; scrollToTop(): boolean; scrollToAbsoluteTop(): Promise; scrollToAbsoluteBottom(): Promise; quickScrollDirections(columns: number, bodyHeight: number): { up: boolean; down: boolean; }; captureState(): AppScrollState; restoreState(state: AppScrollState): void; conversationView(columns: number, bodyHeight: number): { lines: RenderedLine[]; metrics: AppScrollMetrics; }; visibleConversationLines(columns: number, bodyHeight: number): RenderedLine[]; scrollMetrics(columns: number, bodyHeight: number): AppScrollMetrics; scrollByPage(direction: -1 | 1): void; scrollByLines(delta: number, options?: { render?: boolean; }): boolean; private shouldLoadOlderHistory; private shouldLoadNewerHistory; private loadOlderHistoryAnchored; private loadNewerHistoryAnchored; adjustForHistoryWindowPrune(edge: "top" | "bottom", lineCount: number): void; scrollToConversationEntry(entryId: string): boolean; scrollToConversationText(target: ConversationTextScrollTarget): boolean; private setScrollStart; private viewportColumns; }