import type { ImageContent } from "@catui/ai/types"; import { type AgentSession } from "../../core/runtime/agent-session.js"; /** * Options for InteractiveMode initialization. */ export interface InteractiveModeOptions { /** Providers that were migrated to auth.json (shows warning) */ migratedProviders?: string[]; /** Warning message if session model couldn't be restored */ modelFallbackMessage?: string; /** Initial message to send on startup (can include @file content) */ initialMessage?: string; /** Images to attach to the initial message */ initialImages?: ImageContent[]; /** Additional messages to send after the initial message */ initialMessages?: string[]; /** Force verbose startup (overrides quietStartup setting) */ verbose?: boolean; } export declare class InteractiveMode { private options; private session; private ui; private chatContainer; private pendingMessagesContainer; private statusContainer; private defaultEditor; private editor; private autocompleteProvider; private fdPath; private startupToolsPrewarmed; private editorContainer; private footer; private footerDataProvider; private keybindings; private version; private isInitialized; private onInputCallback?; /** Consolidated render/turn UI state (streaming, tools, loaders, run timers, status, queues). */ private readonly state; private skillCommands; private unsubscribe?; private isBashMode; private bashComponent; private pendingBashComponents; private shutdownRequested; private notificationQueue; private extensionTerminalInputUnsubscribers; private widgetContainerAbove; private widgetContainerBelow; /** Pet column next to the input (right side, compact coding-agent style). */ private buddySlot; private editorBuddyLayout; private headerContainer; private builtInHeader; private attachmentsContainer; private imagePipeline; private selfUpdate; private authProviderConfig; private modelOverlay; private treeOverlay; private settingsOverlay; private slashDispatcher; private inputSubmit; private interrupt; private streamRender; private surfaces; private promptHost; private customOverlay; private editorAdapter; private sessionCommands; private personaCommands; private configCommands; private infoCommands; private get agent(); private get sessionManager(); private get settingsManager(); private chatRendererRef; /** * Transcript renderer (message→component mapping, session-context replay, welcome banner, * chat rebuild). Created lazily so partial-mode test harnesses * (Object.create(InteractiveMode.prototype)) keep working with patched host methods; * every context member resolves dynamically through this mode. */ private get chatRenderer(); private externalEditorRef; /** $VISUAL/$EDITOR round-trips. Lazy so partial-mode test harnesses keep working. */ private get externalEditor(); private buddyPetHostRef; /** Desktop-pet lifecycle. Lazy so partial-mode test harnesses keep working. */ private get buddyPetHost(); private agentRunTimerRef; /** Working-message rotation + agent-run timer. Lazy for partial-mode tests. */ private get agentRunTimer(); private statusDisplayRef; /** Chat status/error/warning lines + notifications. Lazy for partial-mode tests. */ private get statusDisplay(); private messageQueueRef; /** Steering/follow-up/compaction queue management. Lazy for partial-mode tests. */ private get messageQueue(); constructor(session: AgentSession, options?: InteractiveModeOptions); private setupAutocomplete; private prewarmStartupTools; init(): Promise; /** * 同步构建 header + layout。把这段从 init() 抽出,让 init() * 的主体只剩"装配与启动",阅读性更好。 */ private buildHeaderAndLayout; /** * Update terminal title with session name and cwd. */ private updateTerminalTitle; /** * Run the interactive mode. This is the main entry point. * Initializes the UI, shows warnings, processes initial messages, and starts the interactive loop. */ run(): Promise; /** * Check npm registry for a newer version. */ private getMarkdownThemeWithSettings; private showLoadedResources; /** * Initialize the extension system with TUI-based UI context. */ private initExtensions; /** * Get a registered tool definition by name (for custom rendering). */ private getRegisteredToolDefinition; /** * Set up keyboard shortcuts registered by extensions. */ private setupExtensionShortcuts; private formatElapsedSeconds; private getNextCatMessage; private updateWorkingMessage; private stopAgentRunTimer; private stopWelcomeBannerTimer; private startAgentRunTimer; private resetExtensionUI; private syncBuddyPet; /** * Restore attachments bar (if any) + editor row with optional buddy column. */ private remountEditorShell; private setBuddyPetState; private addExtensionTerminalInputListener; private clearExtensionTerminalInputListeners; /** * Create the ExtensionUIContext for extensions. */ private createExtensionUIContext; /** * Show a notification for extensions. */ private showExtensionNotify; private shouldRenderToolTrace; /** * Show an extension error in the UI. */ private showExtensionError; private setupKeyHandlers; private setupEditorSubmitHandler; private subscribeToAgent; private addSessionNavigationBanner; private handleEvent; private applyPersonaFromSessionIfAny; /** Extract text content from a user message */ private getUserMessageText; private showStatus; private addMessageToChat; renderInitialMessages(options?: { requestRender?: boolean; }): void; getUserInput(): Promise; private rebuildChatFromMessages; /** * Gracefully shutdown the agent. * Emits shutdown event to extensions (with timeout guard), then exits. */ private isShuttingDown; private shutdown; /** * Check if shutdown was requested and perform shutdown if so. */ private checkShutdownRequested; /** TUI suspend mechanic (Ctrl-Z): stop the TUI, SIGTSTP the group, restore on SIGCONT. */ private suspend; private handleFollowUp; private handleDequeue; private promptAfterRender; private updateEditorBorderColor; private toggleToolOutputExpansion; private setToolsExpanded; private toggleThinkingBlockVisibility; private openExternalEditor; private openExistingFileInExternalEditor; clearEditor(): void; showError(errorMessage: string): void; showWarning(warningMessage: string): void; private clearStatusTimers; /** * Show a priority notification (floating, auto-dismiss, dedup by key). */ notify(message: string, options?: { key?: string; priority?: "immediate" | "high" | "medium" | "low"; type?: "info" | "warning" | "error"; duration?: number; }): void; private getAllQueuedMessages; private clearAllQueues; private updatePendingMessagesDisplay; private restoreQueuedMessagesToEditor; private queueCompactionMessage; private flushCompactionQueue; /** Move pending bash components from pending area to chat */ private flushPendingBashComponents; /** * Shows a selector component in place of the editor. * @param create Factory that receives a `done` callback and returns the component and focus target */ private showSelector; stop(): void; }