/**
 * ╔══════════════════════════════════════════════════════════════════════╗
 * ║   OVERMIND BRIDGE — AgentRegistry (In-Memory State Tracker)          ║
 * ║                                                                      ║
 * ║   Tracke l'état live de chaque agent : busy / idle / offline.        ║
 * ║   Sérialise les appels concurrents vers un même agent via mutex.    ║
 * ║                                                                      ║
 * ║   ARCHITECTURE                                                       ║
 * ║   ─────────────                                                      ║
 * ║   OverBridgeServer → AgentRegistry → (mutex per agent)               ║
 * ║                       → OverBridgeService.runAgent()                ║
 * ╚══════════════════════════════════════════════════════════════════════╝
 */
import type { RunnerType } from './types.js';
import { type BridgeLogger } from './utils.js';
export type AgentLiveStatus = 'online' | 'offline' | 'busy' | 'idle';
export interface AgentLiveState {
    name: string;
    runner: RunnerType;
    status: AgentLiveStatus;
    /** PID du process si connu (via agent_control status) */
    pid?: number;
    /** SessionId de l'appel en cours (si busy) */
    currentSessionId?: string;
    /** Timestamp dernière activité (runAgent / heartbeat) */
    lastActivityAt: number;
    /** Compteur de runs total depuis le boot du bridge */
    totalRuns: number;
    /** Compteur de runs échoués */
    totalErrors: number;
    /** Compteur A2A (combien de fois cet agent a été appelé par un autre agent) */
    a2aReceived: number;
    /** Compteur A2A (combien de fois cet agent a appelé un autre agent) */
    a2aSent: number;
}
export interface ListAgentsFilter {
    /** Filtre par status (ex: tous les 'busy') */
    status?: AgentLiveStatus;
    /** Filtre par runner (ex: 'claude', 'hermes') */
    runner?: RunnerType;
}
export declare class AgentRegistry {
    private readonly states;
    private readonly mutexes;
    private readonly log;
    constructor(logger?: BridgeLogger);
    /**
     * Récupère (ou crée) le mutex associé à un agent.
     * Garantit qu'un seul appel runAgent tourne à la fois par agent.
     */
    private getMutex;
    /**
     * Exécute une fonction sous le mutex de l'agent.
     * Bloque si un autre run est en cours sur le même agent.
     */
    withLock<T>(agentName: string, fn: () => Promise<T>): Promise<T>;
    /**
     * Vérifie si un run est actuellement en cours sur cet agent.
     */
    isBusy(agentName: string): boolean;
    /**
     * Initialise ou met à jour l'état d'un agent.
     * Appelé au premier runAgent ou explicitement via register().
     */
    register(agentName: string, runner: RunnerType): AgentLiveState;
    /**
     * Marque un agent comme busy (run en cours).
     */
    markBusy(agentName: string, sessionId?: string, pid?: number): void;
    /**
     * Marque un agent comme idle (run terminé, agent dispo).
     */
    markIdle(agentName: string, success: boolean): void;
    /**
     * Marque un agent comme offline (kill, crash, ou jamais vu).
     */
    markOffline(agentName: string): void;
    /**
     * Marque un agent comme online (vu récemment, pas en cours).
     */
    markOnline(agentName: string): void;
    /**
     * Incrémente le compteur A2A received (cet agent a été appelé par un autre).
     */
    incrementA2aReceived(agentName: string): void;
    /**
     * Incrémente le compteur A2A sent (cet agent a appelé un autre).
     */
    incrementA2aSent(agentName: string): void;
    /**
     * Récupère l'état d'un agent. Retourne undefined si jamais vu.
     */
    get(agentName: string): AgentLiveState | undefined;
    /**
     * Liste tous les agents connus, optionnellement filtrés.
     */
    list(filter?: ListAgentsFilter): AgentLiveState[];
    /**
     * Liste les agents actuellement busy (utile pour /status global).
     */
    listBusy(): AgentLiveState[];
    /**
     * Liste les agents online et idle (disponibles pour run).
     */
    listAvailable(): AgentLiveState[];
    /**
     * Statistiques globales du registry.
     */
    stats(): {
        total: number;
        online: number;
        busy: number;
        offline: number;
        totalRuns: number;
        totalErrors: number;
    };
    /**
     * Purge les agents offline depuis plus de `maxAgeMs`.
     * Évite que la map grossisse indéfiniment.
     */
    prune(maxAgeMs?: number): number;
}
//# sourceMappingURL=AgentRegistry.d.ts.map