feat(jb_outbound): plugin « rien ne part sans accord » (Jean-Billie) - #1
Merged
Conversation
Greffe a diff minimal (un seul plugin, zero patch du coeur) qui impose la validation humaine sur tout envoi sortant de Hermes. - tool_execution middleware : intercepte send_message (Telegram) ET mcp_composio_* (email/reseaux). PASS (lecture/interne) / PROPOSE (envoi -> proposition) / BLOCK (envoi composio non repertorie = fail-closed). - Asynchrone : enregistre l'envoi (args complets) dans ~/.hermes/jb_pending/, POST DraftRequest au daemon loopback, rend un resultat synthetique. Pas de blocage du run. - Listener loopback (bind 127.0.0.1 strict) : recoit la DecisionItem approuvee -> replay via registry.dispatch (ne repasse pas par le middleware) -> POST ResultRequest. Idempotent, survit au redemarrage. - Minimisation : args complets restent locaux ; DraftRequest ne porte que kind/titre/apercu/destinataire. Passif hors box. Tests : 7 verts, autonomes (HTTP + registre mockes). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…decision) Vrai listener du plugin + stub de control daemon (HTTP loopback). Prouve : envoi intercepte -> proposition deposee -> AUCUN envoi reel avant la decision -> apres push de decision approuvee, replay a l'identique + resultat remonte. 8 tests verts au total. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
jb_outbound — « rien ne part sans accord »
Greffe Jean-Billie sur Hermes Agent. Un seul plugin, zéro patch du cœur → suivi de l'upstream MIT trivial.
Ce que ça fait
Tout envoi sortant de l'assistant — Telegram (
send_message) ou email/réseaux via Composio (mcp_composio_*) — est intercepté et transformé en proposition à valider. L'envoi réel n'a lieu qu'après accord du client. Les deux familles passent par le mêmetool_executionmiddleware → un seul point de greffe couvre tous les canaux et déclencheurs.Boucle
middleware.py) : court-circuite l'outil d'envoi.PASS(lecture/interne) ·PROPOSE(envoi → proposition) ·BLOCK(envoi composio non répertorié = fail-closed).~/.hermes/jb_pending/{jb_id}.json(local, jamais relayé), POSTDraftRequest→127.0.0.1:8442/v1/draft, rend un résultat synthétique au modèle. Pas de blocage du run (asynchrone).listener.py+replay.py) : le daemon pousse laDecisionItemapprouvée sur127.0.0.1:8444/jb/decision→ replay viaregistry.dispatch(ne repasse pas par le middleware) → POSTResultRequest. Idempotent, survit au redémarrage (store persistant).Garde-fous
DraftRequestne porte que kind / titre / aperçu / destinataire d'affichage.127.0.0.1uniquement (symétrique du daemon).JB_DECISION_PUSH_URL, le plugin ne fait rien (usage Hermes standard intact).plugins.enabled: [jb_outbound].Tests
plugins/jb_outbound/test_jb_outbound.py— 7 verts, autonomes (HTTP loopback + registre d'outils mockés, pas besoin d'un env Hermes complet). Couvre classification, mapping, interception (pass/propose/block), replay (exécution + idempotence).Suite
Reste (côté monorepo Jean-Billie) : e2e avec stub daemon (A4) ; build → GHCR → digest → golden image (A3). Réseau host-mode + endpoints loopback déjà câblés (PR NousResearch#32).
🤖 Generated with Claude Code