import type { Request, Response } from 'express';
import type { Logger } from 'pino';
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import type { Config } from '../config.js';
import { ElsClient } from '../elsClient.js';
import type { RequestContext } from '../http/types.js';
import { type RedisService } from '../cache/index.js';
import { type Tier } from '../billing/limits.js';
import type { MiddlewareDeps } from '../middleware/withMiddleware.js';
export interface SessionRecord {
    sessionId: string;
    transport: StreamableHTTPServerTransport;
    server: McpServer;
    client: ElsClient;
    /** Контекст последнего запроса (snapshot — для observability). */
    lastContext?: RequestContext;
    createdAt: number;
    lastTouchedAt: number;
    /** AppSlug сессии (для concurrency-limit и SSE-метрик). */
    appSlug: string;
}
export interface HttpTransportManagerOptions {
    config: Config;
    log: Logger;
    /** TTL idle-сессии, мс. Default 30 минут. */
    sessionTtlMs?: number;
    /** Disable internal cleanup timer (для тестов). */
    noCleanup?: boolean;
    /**
     * Redis для cache layer. Если задан и cacheEnabled — каждая сессия
     * получает CachedElsClient. Иначе — прямой ElsClient.
     */
    redis?: RedisService | null;
    /** Middleware deps (audit / usage / redaction). */
    middlewareDeps?: MiddlewareDeps;
    /**
     * Async tier resolver — резолвит tier per appSlug через LK API (с кэшем
     * 30 сек в Redis). По умолчанию возвращает `config.defaultTier`
     * (используется как fallback при недоступности LK).
     */
    tierResolver?: (ctx: RequestContext) => Promise<Tier> | Tier;
}
export declare class HttpTransportManager {
    private readonly sessions;
    /** Per-app счётчик active sessions (для concurrency-limit). */
    private readonly perAppCount;
    private readonly ttlMs;
    private readonly cleanupTimer;
    private readonly config;
    private readonly log;
    private readonly redis;
    private readonly cachePolicies;
    private readonly middlewareDeps;
    private readonly tierResolver;
    constructor(opts: HttpTransportManagerOptions);
    /** Closes all sessions and stops cleanup. Безопасно вызывать многократно. */
    close(): Promise<void>;
    /**
     * Express handler для `POST /mcp`. Решает, создавать ли новую сессию
     * (если нет `Mcp-Session-Id` И тело — initialize) или использовать
     * существующую.
     */
    handleRequest(req: Request, res: Response): Promise<void>;
    private createSession;
    private incrPerApp;
    private decrPerApp;
    /** Для тестов: текущее число sessions per app. */
    perAppSize(appSlug: string): number;
    private touch;
    private gcExpired;
    /** Для тестов / observability. */
    size(): number;
}
//# sourceMappingURL=http.d.ts.map