import { type AgentSession, type AgentSessionRuntime } from "@earendil-works/pi-coding-agent"; import type { BindCurrentSessionOptions } from "./session-lifecycle-controller.js"; import type { AppSessionEventControllerState } from "./session-event-controller.js"; import type { InputEditorDraftState } from "../../input-editor.js"; import type { AppBlinkController } from "../screen/blink-controller.js"; import type { AppScrollState } from "../screen/scroll-controller.js"; import type { AppOptions, Entry, SessionActivity, SessionTab, SubmittedUserMessage } from "../types.js"; type TabSessionView = { entries: Entry[]; eventState: AppSessionEventControllerState; scrollState: AppScrollState; }; export type TabInputState = InputEditorDraftState; export type AppTabsControllerHost = { readonly options: AppOptions; readonly maxProjectSessions?: number | (() => number | undefined); readonly blinkController: AppBlinkController; runtime(): AgentSessionRuntime | undefined; createRuntimeForNewSession(modelRef?: string): Promise; createRuntimeForSession(sessionPath: string): Promise; draftModelOverrideRef?(): string | undefined; resetDraftModelSelection?(): void; deactivateRuntimeForDraft?(): void; awaitCurrentSessionExtensions?(runtime?: AgentSessionRuntime): Promise; activateRuntime(runtime: AgentSessionRuntime, options?: BindCurrentSessionOptions): Promise; disposeRuntime(runtime: AgentSessionRuntime): Promise; isRunning(): boolean; setStatus(status: string): void; setSessionStatus(session: AgentSession | undefined): void; setSessionActivity(activity: SessionActivity): void; resetSessionView(): void; loadSessionHistory(): void; loadSessionHistoryAsync(options: { isCancelled: () => boolean; render: () => void; lazyOlderHistory?: boolean; }): Promise; captureSessionView?(): TabSessionView; restoreSessionView?(view: TabSessionView): void; restoreScrollState?(state: AppScrollState): void; syncUserSessionEntryMetadata(): void; captureInputState(): TabInputState; restoreInputState(state: TabInputState): void; closeMenusForTabSwitch?(): void; captureAutoUserMessages?(): readonly SubmittedUserMessage[]; restoreAutoUserMessages?(messages: readonly SubmittedUserMessage[]): void; captureDeferredUserMessages?(): readonly SubmittedUserMessage[]; restoreDeferredUserMessages?(messages: readonly SubmittedUserMessage[]): void; openDraftSessionSelector?(): void; closeDraftSessionSelector?(): void; contextInventoryText?(runtime: AgentSessionRuntime, heading: string): string; addEntry(entry: Entry): void; showToast(message: string, kind: "success" | "error" | "warning" | "info"): void; render(): void; }; export declare class AppTabsController { private readonly host; private readonly tabItems; private readonly runtimesByTabId; private readonly runtimeLoadsByTabId; private readonly runtimeSubscriptionsByTabId; private readonly runtimeRefreshTimersByTabId; private readonly historyReloadTimersByTabId; private readonly inputStatesByTabId; private readonly autoUserMessagesByTabId; private readonly deferredUserMessagesByTabId; private readonly sessionViewsByTabId; private readonly scrollStatesByTabId; private readonly tabIdsNeedingHistoryReload; private readonly historyInvalidationGenerationByTabId; private readonly runtimeOwnershipGenerationByTabId; private readonly touchedDraftTabIds; private readonly orphanRuntimeDisposals; private readonly lifecycleMutationQueue; private activeTabId; private pendingActiveTabId; private historyLoadGeneration; private historyInvalidationGeneration; private runtimeOwnershipGeneration; private lifecycleGeneration; private lifecycleMutationRunning; private saveTabsWriteTail; private startupSavedTabs; private startupPrepared; private startupRuntimePlan; private restored; private retentionCleanupRunning; private retentionCleanupScheduled; private prewarmScheduled; private prewarmRunning; constructor(host: AppTabsControllerHost); private runLifecycleMutation; private isLifecycleOwner; cancelPendingLifecycleWork(): void; tabs(): readonly SessionTab[]; isSwitching(): boolean; markTerminalBellAttention(sessionPath: string | undefined): void; tabPanelRows(terminalRows: number): number; activeInputTabId(): string | undefined; isDraftTabActive(): boolean; openSessionPaths(): readonly string[]; noteActiveDraftInputChanged(): void; inputStateForTab(tabId: string | undefined): TabInputState | undefined; setInputStateForTab(tabId: string | undefined, state: TabInputState): Promise; disposeInactiveRuntimes(disposeRuntime?: (runtime: AgentSessionRuntime) => Promise): Promise; saveInputStateForQuit(): Promise; persistActiveDeferredUserMessages(): void; requeueAutoUserMessageForSession(session: AgentSession, message: SubmittedUserMessage): void; inputTabOwnedByRuntime(tabId: string | undefined, runtime: AgentSessionRuntime, session: AgentSession): boolean; syncActiveTabFromRuntime(options?: { save?: boolean; force?: boolean; }): void; prepareStartupRuntime(): Promise<{ sessionPath?: string; } | null>; restoreAfterStartup(): Promise; private restoreAfterStartupMutation; openNewTab(): Promise; private openNewTabMutation; materializeActiveDraftTab(): Promise; private materializeActiveDraftTabMutation; openSessionInActiveDraftTab(sessionPath: string): Promise; private openSessionInActiveDraftTabMutation; private ownsDraftLifecycle; openSessionInNewTab(sessionPath: string): Promise; private openSessionInNewTabMutation; forkSessionEntryInNewTab(entryId: string): Promise; private forkSessionEntryInNewTabMutation; switchToTab(tabId: string): Promise; private switchToTabMutation; private switchDraftToPersistedTab; closeTab(tabId: string): Promise; private closeTabMutation; private closeDraftTabMutation; private replaceLastTabWithNewSession; private loadActiveSessionHistory; private cancelHistoryLoad; private tabsAvailable; private runtimeForCommand; private idleRuntime; private activeTab; private createDraftTab; private activateDraftTab; private clearStartupTabPlaceholders; private storeActiveRuntime; private storeActiveSessionView; private restoreStoredScrollState; private setRuntimeForTab; private deleteRuntimeForTab; private releaseRuntimeOwnership; private clearRuntimeSubscriptions; private observeRuntimeForTab; private isRuntimeOwnedByTab; private queueOrphanRuntimeDisposal; private disposeRuntimeIfOrphan; private adoptCurrentRuntimeAfterFailedRollback; private shouldSyncTabFromRuntimeEvent; private shouldScheduleDelayedSyncForRuntimeEvent; private shouldInvalidateCachedViewForRuntimeEvent; private scheduleDelayedRuntimeSync; private clearRuntimeRefreshTimers; private clearHistoryReloadTimers; private scheduleDelayedHistoryReload; private reloadActiveTabHistoryIfNeeded; private syncTabFromObservedRuntime; private storeActiveInputState; private storeActiveDeferredUserMessages; private restoreInputState; private inputStateFromText; private restoreDeferredUserMessages; private runtimeForTab; private findTabForSession; private findTabBySessionPath; private replaceTabs; private removeTab; private restorePersistedInputStates; private restorePersistedScrollStates; private restorePersistedQueuedUserMessages; private ensureCurrentSessionTab; private tabFromSession; private updateTabFromSession; private sessionPath; private sessionTitle; private sessionIsFork; private sessionTitleFromParts; private updatedSessionTitle; private sessionActivity; private tabActivity; private clearTabAttention; private startAttentionBlink; private stopAttentionBlinkIfIdle; private restoredTabs; private defaultSessionTitleFromPath; private loadSessionTitles; private loadForkedSessionPaths; private scheduleRestoredTabTitleRefresh; private refreshRestoredTabTitles; private loadTabs; private parsePersistedInputState; private parsePersistedScrollState; private parsePersistedSubmittedUserMessages; private saveTabs; private writeTabsSnapshot; private filePath; private sessionDir; private scheduleProjectSessionRetention; private scheduleTabPrewarm; private prewarmTabs; private cleanupOldProjectSessions; /** * Unlink a project session file. Everything here is best-effort: * session retention must never interrupt the terminal UI. */ private unlinkSessionFile; private preservedSessionPaths; private maxProjectSessions; } export {};