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
TypeScript
/**
* ╔══════════════════════════════════════════════════════════════════════╗
* ║ 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