import { Client, type ClientChannel } from 'ssh2';
import { ConnectionService } from './connection.service';
import { type ChildProcess } from 'child_process';
/**
 * 会话接口（统一 SSH 和本地 shell）
 */
interface TerminalSession {
    id: string;
    connectionId: string;
    type: 'ssh' | 'local';
    name: string;
    client?: Client;
    stream?: ClientChannel;
    pty?: any;
    childProcess?: ChildProcess;
    createdAt: Date;
}
/** 会话信息（用于返回给前端） */
export interface SessionInfo {
    sessionId: string;
    connectionId: string;
    type: 'ssh' | 'local';
    name: string;
    createdAt: Date;
    systemContext?: string;
}
/**
 * 终端会话管理服务
 * 支持 SSH 远程连接和本地 Shell
 */
export declare class SSHService {
    private sessions;
    private sessionMetadata;
    private connectionService;
    private outputListeners;
    /** SSH 会话 MOTD 捕获 Promise（连接后自动后台采集） */
    private pendingMOTDCaptures;
    /** Session 元数据持久化文件路径 */
    private sessionsFilePath;
    constructor(connectionService: ConnectionService);
    /**
     * 创建会话（自动判断 SSH 或本地 shell）
     */
    createSession(sessionId: string, connectionId: string, cols?: number, rows?: number, name?: string): Promise<TerminalSession>;
    /**
     * 创建本地 Shell 会话（优先使用 node-pty，降级使用 child_process.spawn）
     */
    private createLocalSession;
    /**
     * 创建 SSH 会话
     */
    private createSSHSession;
    /**
     * 获取默认 Shell
     */
    private getDefaultShell;
    /**
     * 构建干净的 Shell 环境变量
     * 过滤掉 Node.js / npm / pnpm 相关变量，避免子 shell 出现 nvm 等工具警告
     */
    private buildShellEnv;
    /**
     * 获取所有会话信息列表（从 sessionMetadata 读取）
     */
    getSessions(): SessionInfo[];
    /**
     * 重命名会话
     */
    renameSession(sessionId: string, name: string): void;
    /**
     * 删除会话（关闭进程并从 server 端移除 metadata）
     */
    deleteSession(sessionId: string): void;
    /**
     * 获取会话
     */
    getSession(sessionId: string): TerminalSession | undefined;
    /**
     * 从磁盘加载 session 元数据
     */
    private loadSessionsFromDisk;
    /**
     * 将 session 元数据写入磁盘
     */
    private saveSessionsToDisk;
    /**
     * 获取会话的系统上下文（确保每次都有）
     * 如果 session 没有缓存的环境信息，自动采集并持久化
     */
    getSystemContext(sessionId: string): Promise<string>;
    /**
     * 启动后台 MOTD 捕获（不阻塞 session 创建）
     */
    private startMOTDCapture;
    /**
     * 捕获 SSH 登录 MOTD 并解析为系统信息
     */
    private captureMOTD;
    /**
     * 解析 SSH 登录 MOTD，提取系统环境信息
     * 兼容 Ubuntu/Debian/CentOS/RHEL/Fedora/FreeBSD 等不同发行版格式
     */
    private parseMOTD;
    /**
     * 采集本地系统环境信息（仅用于 local session）
     */
    private collectLocalSystemInfo;
    /**
     * 采集 Windows 系统环境信息（PowerShell）
     */
    private collectWindowsSystemInfo;
    /**
     * 采集 Unix/macOS/Linux 系统环境信息（Bash）
     */
    private collectUnixSystemInfo;
    /**
     * 格式化采集结果
     */
    private formatSystemInfo;
    /**
     * 向会话写入数据（用户输入）
     */
    writeData(sessionId: string, data: string | Buffer): boolean;
    /**
     * 注册输出监听器（用于 Agent 捕获终端输出）
     * 注意：此方法不拦截现有 WebSocket 转发，仅添加额外监听
     */
    addOutputListener(sessionId: string, listener: (data: string) => void): void;
    /**
     * 移除输出监听器
     */
    removeOutputListener(sessionId: string): void;
    /**
     * 通知输出监听器（由 WebSocket 处理器在收到终端输出时调用）
     */
    notifyOutput(sessionId: string, data: string): void;
    /**
     * 捕获会话在指定时间内的输出
     * @param sessionId 会话 ID
     * @param timeoutMs 等待时间（毫秒），默认 2000
     * @returns 捕获的输出文本（已去除 ANSI 转义序列）
     */
    captureOutput(sessionId: string, timeoutMs?: number): Promise<string>;
    /**
     * 调整终端窗口大小
     */
    resize(sessionId: string, cols: number, rows: number): boolean;
    /**
     * 关闭会话
     */
    closeSession(sessionId: string): void;
    /**
     * 关闭所有会话
     */
    closeAllSessions(): void;
    /**
     * 获取活跃会话数量
     */
    getActiveSessionCount(): number;
    /**
     * 获取所有活跃会话 ID
     */
    getActiveSessionIds(): string[];
}
export {};
//# sourceMappingURL=ssh.service.d.ts.map