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
89 lines • 3.9 kB
JavaScript
/**
* ═══════════════════════════════════════════════════════════════════════════
* Audit Trail — Hook pour les runners LLM
* ═══════════════════════════════════════════════════════════════════════════
*
* Point d'entrée unique pour appliquer le guard d'audit avant chaque exécution LLM.
* Évite de modifier les 8 fichiers *Runner.ts individuellement.
*
* Appelé par run_agent.ts (dispatcher central).
*/
import { auditGuard, logTransfer } from './guard.js';
import { isAuditEnabled } from './types.js';
import { getProviderInfo, requiresExplicitConsent } from './transfer_map.js';
/**
* Map les noms de runners Overmind vers les providers audit.
* Le runner est la CLI (claude, gemini, etc.), le provider est l'infra LLM.
*/
const RUNNER_TO_PROVIDER = {
claude: 'anthropic',
gemini: 'google',
kilo: 'openai', // KiloCode utilise OpenAI-compatible APIs
qwencli: 'zai', // Qwen / Zhipu
openclaw: 'anthropic', // OpenClaw — Anthropic-compatible
cline: 'anthropic', // Cline — Anthropic-compatible
opencode: 'openai', // OpenCode — OpenAI-compatible
hermes: 'unknown', // Hermes — dépend du provider configuré dans le profile
};
/**
* Applique le guard d'audit avant l'exécution d'un runner LLM.
*
* Si OVERMIND_AUDIT_ENABLED=false → pass-through (comportement v3.8).
* Si true → détecte les RP, valide le consentement, log le transfert.
*
* @param runner Nom du runner (claude, gemini, hermes, etc.)
* @param prompt Prompt envoyé au runner
* @param agentName Nom de l'agent (optionnel)
* @returns RunnerHookResult — allowed=false si bloqué par le guard
*/
export async function auditRunnerHook(runner, prompt, agentName) {
const provider = RUNNER_TO_PROVIDER[runner] || 'unknown';
const piiFilter = process.env.OVERMIND_PII_FILTER === 'true';
// ── Guard principal ──
const guardResult = await auditGuard({
prompt,
dataSubjectId: agentName ? undefined : process.env.OVERMIND_CURRENT_SUBJECT_ID,
purpose: `agent_execution_${runner}`,
provider,
sanitize: piiFilter,
});
if (!guardResult.allowed) {
return {
allowed: false,
reason: guardResult.reason,
context: guardResult.context,
retentionExpiresAt: guardResult.retentionExpiresAt,
};
}
// ── Log de transfert (documentation seule, pas de blocage) ──
if (isAuditEnabled() && requiresExplicitConsent(provider)) {
const providerInfo = getProviderInfo(provider);
logTransfer({
dataSubjectId: guardResult.context.dataSubjectId || null,
destination: providerInfo.name,
destinationRegion: providerInfo.region,
legalMechanism: providerInfo.mechanism,
dataType: 'prompt',
}).catch(() => { }); // fire-and-forget
}
return {
allowed: true,
context: guardResult.context,
sanitizedPrompt: guardResult.sanitizedPrompt,
retentionExpiresAt: guardResult.retentionExpiresAt,
};
}
/**
* Enrichit les paramètres de storeRun avec les champs d'audit.
* À appeler après l'exécution du runner pour persiste le contexte audit.
*/
export function enrichStoreRunParams(hookResult) {
return {
dataSubjectId: hookResult.context.dataSubjectId,
legalBasis: hookResult.context.legalBasis,
consentRef: hookResult.context.consentRef,
retentionExpiresAt: hookResult.retentionExpiresAt,
purpose: hookResult.context.purpose,
};
}
//# sourceMappingURL=runner_hook.js.map