import React, { createContext, lazy, memo, Suspense, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'; import { activeTabStore } from '../../application/state/activeTabStore'; import { applySessionPresentation, usePresentedSession, } from '../../application/state/sessionPresentationStore'; import { useTerminalLayoutSuppressActive } from '../../application/state/terminalLayoutSuppressStore'; import type { TerminalSessionExitEvent } from '../../application/state/resolveTerminalSessionExitIntent'; import { createTerminalSelectionAttachment } from '../../application/state/terminalSelectionAttachment'; import { getTopTabInsertionTarget, isPointInsideRect, WORKSPACE_SESSION_DRAG_TYPE } from '../../application/state/terminalDragData'; import { useAIState } from '../../application/state/useAIState'; import { useAISessionsStore } from '../../application/state/aiSessionsStore'; import { useStoredBoolean } from '../../application/state/useStoredBoolean'; import { isSavedVaultHost } from '../../domain/ephemeralHosts'; import { buildAITerminalSessionInfo, type AIPanelContext, type AITerminalSessionInfo, } from '../../domain/buildAITerminalSessionInfo'; export { buildAITerminalSessionInfo }; export type { AIPanelContext, AITerminalSessionInfo }; import { collectSessionIds, SplitDirection } from '../../domain/workspace'; import { resolveSessionTabTitle } from '../../domain/sessionTabTitle'; import { terminalPaneSessionsEqual } from '../../domain/terminalPaneSessionsEqual'; import { resolveTerminalHibernateEnabled, resolveTerminalHibernateEnabledForProtocol, } from '../../domain/terminalHibernate'; import { KeyBinding, TerminalSettings } from '../../domain/models'; import type { TerminalCwdChangeMeta } from '../terminal/sftpCwd'; import { STORAGE_KEY_AI_SHOW_TERMINAL_SELECTION_ACTION } from '../../infrastructure/config/storageKeys'; import { cn } from '../../lib/utils'; import { LazyLoadBoundary } from '../ui/lazy-load-boundary'; import type { DropEntry } from '../../lib/sftpFileUtils'; import type { GroupConfig, Host, Identity, KnownHost, ProxyProfile, SSHKey, Snippet, TerminalSession, VaultNote, Workspace } from '../../types'; import type { ExecutorContext } from '../../infrastructure/ai/cattyAgent/executor'; import type { AISession } from '../../infrastructure/ai/types'; import Terminal from '../Terminal'; import { removePaneVisible, setPaneVisible } from '../terminal/paneVisibilityStore'; import type { TerminalBroadcastInputOptions } from '../terminal/terminalHelpers'; import type { TerminalContextReader } from '../../domain/terminalContextRead'; import { getTerminalPaneRenderSnapshot, parseTerminalPaneRenderSnapshot, resolveInactiveTerminalPaneStyle, shouldUseTerminalPaneSplitLayout, type TerminalPaneHiddenSize, } from '../terminalPaneVisibility'; import type { ResolvedAppearance, TerminalAppearanceHostScope } from '../../domain/terminalAppearanceRuntime'; import type { TerminalSidePanelAutoOpenTab } from '../../domain/terminalSidePanelAutoOpen'; import type { SidePanelTool } from '../../domain/sidePanelLayout'; import { resolvePaneMagnificationStyle, type PaneMagnificationController, type PaneMagnificationTarget, } from '../../domain/paneMagnification'; export type SidePanelTab = SidePanelTool; const LazyAIChatSidePanel = lazy(() => import('../AIChatSidePanel').then((module) => ({ default: module.AIChatSidePanel })), ); if (typeof requestIdleCallback === 'function') { requestIdleCallback(() => { void import('../AIChatSidePanel'); }); } const AIChatSidePanelFallback = memo(function AIChatSidePanelFallback() { return (