/** * tui-repl.ts — Custom REPL sin Ink/React. * * Reemplaza ink-app.tsx con un loop de eventos basado en EventEmitter. * El estado es un objeto mutable; `scheduleRedraw()` hace debounce de 16ms * para no redibujar más de ~60fps. El resultado es idéntico en features * a ink-app.tsx pero con control total de stdin → rueda del ratón funciona. */ import { type Mode } from './mode.js'; import { type CustomCommand } from './custom-commands.js'; import type { SqAgent } from '../agent/agent.js'; import type { SqConfig } from '../config.js'; import type { McpManager } from '../mcp/manager.js'; import type { TaskItem } from '../tools/tasks.js'; export type OutputLineKind = 'user_header' | 'user_body' | 'agent_header' | 'agent_body' | 'agent_code_fence_open' | 'agent_code' | 'agent_code_fence_close' | 'tool_start' | 'diff_remove' | 'diff_add' | 'task_item' | 'turn_end' | 'error' | 'info' | 'thinking'; export interface OutputLine { id: number; kind: OutputLineKind; text: string; lang?: string; blockIndex?: number; } export interface ModalPermission { toolName: string; detail: string; preview?: string; patternSuggestion: string | null; idx: number; resolve: (r: { approved: boolean; explanation?: string; }) => void; } export interface ModalModelPicker { options: Array<{ alias: string; label: string; }>; idx: number; } export interface ModalMcp { idx: number; /** true mientras hay un reconnect en curso para ese server */ connecting: Set; } export interface ModalQuestion { question: string; options: Array<{ label: string; description?: string; }>; multi: boolean; idx: number; checks: Set; resolve: (answer: string) => void; /** When user selects "Other…", we enter free-text mode */ otherMode: boolean; otherText: string; } export interface AppState { lines: OutputLine[]; filteredLines: OutputLine[]; scrollOffset: number; input: string; cursorPos: number; history: string[]; histIdx: number; savedInput: string; suggestions: string[]; suggestionIdx: number; escPending: boolean; isProcessing: boolean; pendingQueue: string[]; inCodeBlock: boolean; codeBlockCounter: number; streamTokens: number; thinkingStart: number; mode: Mode; cost: number; ctxPct: number; contextWindowPct: number; model: string; sidebarVisible: boolean; thinkingCollapsed: boolean; tasklistCollapsed: boolean; showHelp: boolean; projectName: string; cwd: string; sessionFiles: Map; taskPanelItems: TaskItem[]; sidebarTasks: TaskItem[]; mcpManager: McpManager | null; sidebarScrollOffset: number; authStatus: { anthropic: boolean; openai: boolean; google: boolean; }; routerEnabled: boolean; routerLearning: boolean; fiveHourResetAt: number; sidebarCollapsed: { providers: boolean; mcp: boolean; tasks: boolean; files: boolean; processes: boolean; }; bgShells: Array<{ id: string; command: string; status: string; exitCode: number | null; ageS: number; }>; activeMonitors: Array<{ id: string; description: string; command: string; ageS: number; }>; /** Images waiting to be sent with the next prompt (from Ctrl+V or @image.png). */ pendingAttachments: Array<{ base64: string; mediaType: string; label: string; }>; permissionRequest: ModalPermission | null; pendingQuestion: ModalQuestion | null; modelPicker: ModalModelPicker | null; mcpPicker: ModalMcp | null; } export interface TuiReplOpts { agent: SqAgent; config: SqConfig; cwd: string; projectName: string; version: string; authStatus: { anthropic: boolean; openai: boolean; google: boolean; }; customCommands?: CustomCommand[]; mcpManager?: McpManager; resumedInfo?: { sessionId: string; turns: number; }; } export declare function runTuiRepl(opts: TuiReplOpts): Promise; //# sourceMappingURL=tui-repl.d.ts.map