/** * ComposableMessage - Data structure for building messages from multiple parts * * Handles multi-line pastes by storing them as editable blocks that can be: * - Displayed as summaries * - Edited individually * - Assembled into a final message when sent * * Architecture: * - MessagePart: Union type for text or paste blocks * - ComposableMessageBuilder: Manages parts and provides editing/assembly * - UI helpers: Format blocks for display with summaries */ export type MessagePartType = 'text' | 'paste'; export interface TextPart { type: 'text'; id: string; content: string; timestamp: number; } export interface PastePart { type: 'paste'; id: string; content: string; lineCount: number; timestamp: number; summary: string; edited: boolean; } export type MessagePart = TextPart | PastePart; export interface ComposableMessageState { parts: MessagePart[]; currentDraft: string; } /** * Paste size warning thresholds */ export declare const PASTE_LIMITS: { readonly WARN_CHARS: 10000; readonly WARN_LINES: 100; readonly MAX_CHARS: 500000; readonly MAX_LINES: 5000; }; /** * Paste size check result */ export interface PasteSizeCheck { ok: boolean; warning?: string; error?: string; chars: number; lines: number; } /** * Builds messages from composable parts (text + paste blocks) * Allows editing blocks before final assembly * * Features: * - Undo/redo support for paste operations * - Size warnings for large pastes * - Inline editing of paste blocks */ export declare class ComposableMessageBuilder { private parts; private currentDraft; private idCounter; private history; private historyIndex; private maxHistorySize; constructor(); /** * Save current state to history */ private saveHistory; /** * Undo last operation */ undo(): boolean; /** * Redo last undone operation */ redo(): boolean; /** * Check if undo is available */ canUndo(): boolean; /** * Check if redo is available */ canRedo(): boolean; /** * Check paste size and return warnings/errors */ static checkPasteSize(content: string): PasteSizeCheck; /** * Get current state */ getState(): ComposableMessageState; /** * Check if message is empty */ isEmpty(): boolean; /** * Check if message has content */ hasContent(): boolean; /** * Get number of parts */ getPartCount(): number; /** * Set current draft text */ setDraft(text: string): void; /** * Get current draft */ getDraft(): string; /** * Add a text part from current draft */ commitDraft(): void; /** * Add a paste block * @returns Paste ID, or null if paste was rejected due to size limits */ addPaste(content: string): string | null; /** * Add a paste block without size check (for internal use) */ addPasteUnchecked(content: string): string; /** * Edit a paste block by ID */ editPaste(id: string, newContent: string): boolean; /** * Remove a part by ID */ removePart(id: string): boolean; /** * Get a part by ID */ getPart(id: string): MessagePart | null; /** * Assemble final message from all parts */ assemble(): string; /** * Clear all parts and draft */ clear(): void; /** * Format for display in chat */ formatForDisplay(): string; /** * Format summary for status display */ formatSummary(): string; /** * Format paste blocks as inline chips for prompt display. * Returns a string like: "[📝 Code: 15L/2.3kc] [📋 Text: 50L/5kc]" * Returns empty string if no paste blocks exist. */ formatPasteChips(): string; /** * Format a single paste chip with type detection */ private formatPasteChip; /** * Get count of paste blocks only */ getPasteBlockCount(): number; /** * Generate a summary for a paste block */ private generateSummary; /** * Generate unique ID for parts */ private generateId; } //# sourceMappingURL=composableMessage.d.ts.map