/**
 * ╔══════════════════════════════════════════════════════════════════════╗
 * ║   OVERMIND BRIDGE — SessionStore (Multi-Tenant Session Map)         ║
 * ║                                                                      ║
 * ║   Gère une map clé_externe → session_id avec TTL et persistence.     ║
 * ║   Inspiré du pattern bt-sms (phone → sessionId avec TTL 4h).        ║
 * ║                                                                      ║
 * ║   USAGE                                                              ║
 * ║   ─────                                                              ║
 * ║   Clé externe = n'importe quoi : téléphone, user_id, channel_id,     ║
 * ║   conversation_id, etc. Le bridge isole les sessions par clé.        ║
 * ║                                                                      ║
 * ║   {                                                                  ║
 * ║     "agent.run": { agentName, runner, prompt, externalKey: "+1418..." } ║
 * ║   }                                                                  ║
 * ║   → le bridge retrouve ou crée une session pour cette clé,          ║
 * ║   la passe à l'agent, et la sauvegarde dans le store.               ║
 * ╚══════════════════════════════════════════════════════════════════════╝
 */
import { type BridgeLogger } from './utils.js';
export interface SessionEntry {
    /** Clé externe fournie par le caller (phone, userId, etc.) */
    externalKey: string;
    /** SessionId réel retourné par l'agent (Hermes/Claude/etc.) */
    sessionId: string;
    /** Agent name (pour multi-tenant multi-agent) */
    agentName: string;
    /** Runner utilisé (pour invalidation si le runner change) */
    runner: string;
    /** Timestamp dernière activité */
    lastActivityAt: number;
    /** Contexte additionnel optionnel (le CONTEXT_UPDATE de bt-sms) */
    context?: Record<string, unknown>;
    /** Statut temporaire (idle/busy — optionnel) */
    status?: 'idle' | 'busy';
}
export interface SessionStoreConfig {
    /** Chemin du fichier de persistence (optionnel — si absent, in-memory only) */
    persistPath?: string;
    /** TTL en ms (default: 4h, comme bt-sms) */
    ttlMs?: number;
    /** Cleanup interval en ms (default: 5min) */
    cleanupIntervalMs?: number;
}
export interface SessionContextPatch {
    /** Champs à patcher dans le context */
    patch: Record<string, unknown>;
}
export declare class SessionStore {
    private readonly map;
    private readonly log;
    private readonly config;
    private cleanupTimer;
    private writeQueue;
    constructor(config?: SessionStoreConfig, logger?: BridgeLogger);
    /**
     * Initialise le store : charge le fichier de persistence si présent,
     * démarre le cleanup périodique.
     */
    init(): Promise<void>;
    /**
     * Arrête le cleanup et persiste l'état final.
     */
    close(): Promise<void>;
    /**
     * Récupère une session par (externalKey, agentName).
     * Retourne undefined si absente ou expirée.
     */
    get(externalKey: string, agentName: string): SessionEntry | undefined;
    /**
     * Sauvegarde ou met à jour une session. Retourne l'entrée.
     */
    set(entry: Omit<SessionEntry, 'lastActivityAt'> & {
        lastActivityAt?: number;
    }): SessionEntry;
    /**
     * Met à jour uniquement le sessionId (cas typique : après un run, on a le vrai ID).
     */
    updateSessionId(externalKey: string, agentName: string, sessionId: string, runner: string): SessionEntry | undefined;
    /**
     * Met à jour le context (pattern CONTEXT_UPDATE de bt-sms).
     */
    updateContext(externalKey: string, agentName: string, patch: Record<string, unknown>): SessionEntry | undefined;
    /**
     * Supprime une session.
     */
    delete(externalKey: string, agentName: string): boolean;
    /**
     * Purge toutes les sessions (reset complet).
     */
    clear(): void;
    /**
     * Liste toutes les sessions actives (non expirées).
     */
    list(): SessionEntry[];
    /**
     * Stats par agent.
     */
    stats(): {
        total: number;
        byAgent: Record<string, number>;
    };
    private makeKey;
    private isExpired;
    private purgeExpired;
    private schedulePersist;
    private persist;
}
//# sourceMappingURL=SessionStore.d.ts.map