import fs from "node:fs";
import type { IncomingMessage } from "node:http";
import type { Socket } from "node:net";
import type { Router } from "express";
import * as pty from "node-pty";
import WebSocket from "ws";
export type PtySessionStatus = "running" | "exited";
export interface PtySessionSummary {
    id: string;
    title: string;
    workspacePath: string;
    shell: string;
    cols: number;
    rows: number;
    status: PtySessionStatus;
    createdAt: string;
    lastActiveAt: string;
    exitCode?: number;
    signal?: number;
    attachedClients: number;
    ownerUserId?: string;
    tenantId?: string;
    projectName?: string;
}
interface PtySessionEntry extends PtySessionSummary {
    ptyProcess: pty.IPty;
    sockets: Set<WebSocket>;
    outputBuffer: string;
    idleTimer: NodeJS.Timeout | null;
    persistent: boolean;
}
export declare const ptySessions: Map<string, PtySessionEntry>;
/**
 * 解析 PTY 空闲清理时间。
 * 主流程：读取环境变量 -> 非法值回退默认值 -> 用于 WebSocket 全断开后的延迟清理。
 */
export declare function resolvePtyIdleTtlMs(env?: NodeJS.ProcessEnv): number;
/**
 * 选择默认 shell。
 * 主流程：Windows 优先 pwsh/powershell/cmd；Unix 优先 SHELL/bash/sh，返回可执行文件名与参数。
 */
export declare function resolveDefaultShell(platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv, existsSync?: (path: fs.PathLike) => boolean): {
    shell: string;
    args: string[];
};
/**
 * 校验并解析 shell 选择。
 * 主流程：auto 使用默认 shell；显式 shell 必须命中 allowlist，避免前端任意执行二进制。
 */
export declare function resolveRequestedShell(requestedShell: unknown, platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): {
    shell: string;
    args: string[];
};
/**
 * 判断候选路径是否位于允许根目录中。
 * 具体逻辑：使用 path.relative 处理 Windows/Unix 分隔符，拒绝向上穿越和跨盘路径。
 */
export declare function isPathInsideRoot(candidatePath: string, rootPath: string): boolean;
/**
 * 解析并校验 PTY 工作目录。
 * 主流程：要求绝对目录存在；如果配置 AWS_PTY_ALLOWED_ROOTS，则必须位于允许根目录内。
 */
export declare function resolvePtyWorkspacePath(workspacePath: unknown, env?: NodeJS.ProcessEnv): string;
/**
 * 创建 PTY session。
 * 主流程：校验 cwd/shell -> spawn 真实 PTY -> 注册 output/exit 事件 -> 返回元数据给控制面。
 */
export declare function createPtySession(input: {
    workspacePath: unknown;
    title?: unknown;
    shell?: unknown;
    cols?: unknown;
    rows?: unknown;
    persistent?: unknown;
    preCommand?: unknown;
    ownerUserId?: unknown;
    tenantId?: unknown;
    projectName?: unknown;
}): PtySessionSummary;
export declare function resolvePtyExitedTtlMs(env?: NodeJS.ProcessEnv): number;
export declare function resolveMaxPtySessions(env?: NodeJS.ProcessEnv): number;
export declare function listPtySessions(): PtySessionSummary[];
export declare function getPtySessionSummary(id: string): PtySessionSummary | undefined;
/**
 * 生成短期 PTY 连接令牌。
 * 主流程：确认 session 存在 -> 生成随机 token -> 记录 session 绑定和过期时间。
 */
export declare function createPtyConnectToken(sessionId: string): {
    token: string;
    expiresAt: string;
} | undefined;
/**
 * 关闭 PTY session。
 * 主流程：关闭连接 -> kill PTY -> 清理定时器和内存索引。
 */
export declare function closePtySession(id: string, reason?: string): boolean;
export declare function closeAllPtySessions(reason?: string): void;
export declare const ptyRouter: Router;
/**
 * 将 PTY WebSocket upgrade 挂到 HTTP server。
 * 主流程：匹配 /pty/sessions/:id/stream -> token 校验 -> session 校验 -> 交给 noServer WSS。
 */
export declare function attachPtyWebSocketServer(server: {
    on: (event: "upgrade", listener: (request: IncomingMessage, socket: Socket, head: Buffer) => void) => unknown;
}): void;
export {};
//# sourceMappingURL=pty.d.ts.map