import type { AgentEvent, SubscriptionUsage } from '../api/types.js'; import { type Mode } from './mode.js'; /** Pick the 5h utilisation that matches the *active* model, not the global * aggregate. Anthropic emits a per-family header alongside the global * one; Claude Code's status bar uses the family-specific one, so to keep * the two CLIs in sync we do the same. Falls back to the aggregate if * the family-specific header is missing (0). */ export declare function effectiveFiveHour(sub: import('../api/types.js').SubscriptionUsage, model: string): number; export declare class Renderer { private isStreaming; private isThinking; /** Si true, acumula thinking text en un buffer en vez de imprimirlo línea a línea. */ private thinkingCollapsed; private promptChar; setPromptChar(ch: string): void; private thinkingBuffer; /** Toggle desde el REPL (via /style thinking expanded|collapsed). */ setThinkingCollapsed(on: boolean): void; /** Visibilidad de la task list (Ctrl+T toggle). */ private tasklistCollapsed; setTasklistCollapsed(on: boolean): void; getTasklistCollapsed(): boolean; private hasToolBlock; private spinner; /** Columna actual dentro del bloque de texto (para wrap manual con `│`). */ private col; /** Buffer de texto pendiente de procesar como markdown (hasta el próximo \n). */ private mdBuffer; /** Estado: dentro de un bloque ```code```. Atraviesa varias líneas. */ private inCodeBlock; private turnStartedAt; private turnTools; private turnTokensIn; private turnTokensOut; private turnFilesModified; private turnFilesCreated; /** Último input de tool_start — lo usamos en tool_result para mostrar el diff. */ private lastToolInput; private lastToolName; /** Garantiza que el spinner esté parado antes de escribir cualquier otra cosa. */ private stopSpinner; /** * Versión pública: para que pickers externos (AskUserQuestion, /mcp) puedan * silenciar el spinner antes de tomar el control de la pantalla. Sin esto, * el timer del spinner sigue escribiendo en raw mode y rompe el rendering * del picker. */ stopSpinnerExternal(): void; /** * Escribe texto dentro del bloque con `│` a la izquierda, haciendo wrap * manual en el ancho del terminal. Width medido sin ANSI codes para que * `\x1b[1mfoo\x1b[0m` cuente como 3 cols (no 11). */ private writeWrapped; /** * Drena el buffer de markdown: procesa todas las líneas completas (con \n) * aplicando estilos. Si `flushPartial=true`, también renderiza la última * línea sin \n (al cerrar el turno con 'done'). */ private flushMdLines; /** * Streaming híbrido: escribe chunks plain al instante, y cuando llega \n * borra la línea actual y re-renderiza con markdown aplicado. * * stream(chunk) → [plain chars] ... \n → [erase + md(line)] \n [next] * * Mantiene `mdBuffer` como la línea en curso (sin \n). Al ver \n: * 1. `\r\x1b[K` limpia la línea visible * 2. Escribe `│ ` prefijo * 3. writeWrapped(renderMdLine(buffer)) → línea con estilos * 4. \n + barrita para siguiente línea * 5. Resetea buffer */ private streamText; private tableState; private flushTableIfAny; /** Renderiza UNA línea (sin \n) con markdown aplicado, respetando code blocks. */ private writeMdLine; renderEvent(event: AgentEvent): void; private toolDetail; /** Track Write/Edit/Bash creations + modifications para el summary. */ private trackFileFromTool; /** * Si en el turno el modelo usó TaskCreate/TaskUpdate, mostramos el checklist * actualizado. Se llama tanto live (tras cada TaskCreate/Update) como al final * del turno en `done`. */ private printTaskListIfActive; /** * Renderiza un diff al estilo Claude Code: líneas eliminadas en rojo (-) * y añadidas en verde (+). Se muestra inmediatamente tras `├─ Edit/Write`. * Limitado a MAX_DIFF_LINES líneas totales para no inundar el terminal. */ private renderDiff; /** Resumen tras `╰──` con: tools usadas, tokens, tiempo, ficheros tocados. */ private printTurnSummary; /** * Devuelve SOLO la línea de status (sin saltos de línea, sin prompt). * Útil para absolute positioning cuando el input está pinned. */ renderStatusLine(info: { project?: string; branch?: string; cwd?: string; contextPercent: number; costUsd: number; model: string; subscriptions?: { anthropic: SubscriptionUsage | null; openai: SubscriptionUsage | null; google: SubscriptionUsage | null; } | null; }): string; renderStatus(info: { project?: string; branch?: string; cwd?: string; contextPercent: number; costUsd: number; model: string; /** Modo actual del agente (default / accept-edits / plan / bypass). */ mode?: Mode; /** Snapshot de suscripción por provider. Se muestra el del modelo actual. */ subscriptions?: { anthropic: SubscriptionUsage | null; openai: SubscriptionUsage | null; google: SubscriptionUsage | null; } | null; }): string; private shortModelName; renderWelcome(version: string, auth: { anthropic: boolean; openai: boolean; google: boolean; }, cwd?: string): void; /** * Banner grande con ASCII art. Disponible si el usuario lo quiere via * flag o comando (/banner). Usado por defecto solo cuando pin_input_bottom * está deshabilitado, ya que ocupa ~13 filas del scroll region. */ renderWelcomeFull(version: string, auth: { anthropic: boolean; openai: boolean; google: boolean; }, cwd?: string, style?: 'big' | 'compact' | 'slant'): void; } //# sourceMappingURL=renderer.d.ts.map