UNPKG

overmind-mcp

Version:

Orchestrateur universel agents IA multi-modeles via MCP. Inclut le protocole 'Custom-Nickname' pour identifier vos agents avec des surnoms originaux (The Chaos Prophet, Shadow Sniper, etc.), l'isolation mémoire (Private Memory Context) et le support pour

109 lines • 4.69 kB
/** * ╔══════════════════════════════════════════════════════════════════════╗ * ║ 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