Skip to content
guthubrxPublic

About

Le standard téléphonique de vos agents IA. Daemon local, CLI et MCP pour faire coopérer Claude, Codex, Cursor et Gemini : annuaire, messages avec reçu, fils partagés, passation, recherche. Rust, local-first, sans cloud.

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Bridget

Bridget

Le standard téléphonique de vos agents IA.
Claude, Codex, Cursor, Gemini : ils se trouvent, se parlent, se passent le relais et retrouvent ce qui a été dit.
Sur votre machine. Sans orchestrateur externe, sans dépenser un token de plus que nécessaire.

Rust Local-first Tests Rust Licence


Pourquoi Bridget

Vous avez un agent Claude qui code, un Codex qui relit, un Cursor qui explore. Chacun est excellent seul, et muet pour les autres. Pour les faire coopérer, on copie-colle, on relance, on refait expliquer le contexte, et chaque relance coûte une conversation entière.

Bridget met un daemon local entre eux. Il tient l'annuaire, achemine les messages, garde la trace de qui a reçu quoi, héberge les discussions communes et se souvient de tout pendant sept jours. Les agents y accèdent par la ligne de commande ou par MCP, avec une identité attestée par leur connexion, jamais par un paramètre qu'on pourrait inventer.

Un message part une fois, arrive une fois, et vous savez s'il a été lu. Le reste est du bruit.

Ce que ça change, concrètement

Vous voulez… Avant Avec Bridget
demander une relecture à un agent d'un autre fournisseur copier le diff dans son terminal, attendre, recopier la réponse bridget send --to <agent> --reply "relis ce diff" et la réponse revient dans votre fil
faire travailler trois agents sur le même sujet trois conversations, chaque info envoyée deux fois, chaque envoi facturé un fil partagé : on écrit une fois, personne n'est réveillé sauf celui qu'on nomme
passer le relais à un agent frais lui recoller vingt écrans de contexte un dossier de passation structuré, validé, borné à 16 Kio
retrouver « ce qu'on avait décidé sur la pagination » relire des journaux bridget ledger search --query "pagination décision" puis relecture exacte du message
savoir si un message est vraiment arrivé espérer un reçu typé : accepted, in_flight, outcome_unknown, et le rejeu à l'identique qui ne duplique jamais
relier deux machines un serveur web, des tokens, un tunnel une fédération SSH entre daemons, même protocole, mêmes identités

Soixante secondes pour essayer

# 1. Construire et lancer une instance privée depuis les sources
cd /Users/moi/Nextcloud/10.Scripts/64.bridget
/Users/moi/.cargo/bin/cargo build --release -p bridget-daemon
umask 077
export BRIDGET_HOME="$(mktemp -d /tmp/bgessai.XXXXXX)"
export BRIDGET_SOCKET="$BRIDGET_HOME/bridget.sock"
export PATH="/Users/moi/Nextcloud/10.Scripts/64.bridget/target/release:$PATH"
bridget daemon &

# 2. Voir les agents du projet ; --global permet une recherche volontaire
bridget who --project-root /Users/moi/Nextcloud/10.Scripts/64.bridget

# 3. Parler à un agent et attendre sa réponse
bridget send --project-root /Users/moi/Nextcloud/10.Scripts/64.bridget --to '<agent_id_uuid>' --reply --timeout 120 -- 'Vérifie ce point et réponds avec ton résultat.'

# 4. Ouvrir un fil à trois, sans réveiller personne, puis solliciter un seul membre
#    (--id est une clé de rejeu : la même après une coupure, jamais un doublon)
bridget thread create --title "Relecture sécurité" --member '<B>' --member '<C>' --id "$(uuidgen)"
bridget thread post '<fil>' --kind history --silent --id "$(uuidgen)" -- "Contexte : voici le périmètre."
bridget thread post '<fil>' --kind action --notify '<B>' --id "$(uuidgen)" -- "B, peux-tu vérifier le point 3 ?"

# 5. Retrouver et citer
bridget ledger search --query "point 3" --limit 5
bridget ledger read --id '<id>' --target '<uuid>' --offset <match_offset> --digest <body_digest>

Le guide complet d'installation, y compris le pont vers T3 Code (bridget t3 install), est dans docs/communication-installation.md. Un daemon neuf n'a pas encore d'agents : lancer leurs wrappers ou rattacher T3. Les exemples de fil supposent une session attestée et des membres du même projet. Un fil mixte exige un motif explicite à chaque création ou dépôt, même silencieux.

Coordonner sans T3

Un agent lancé par Bridget peut créer un enfant et lui confier une mission en une commande :

bridget delegate "Analyse les tests et rends les risques principaux"
bridget task wait '<task_id>'
bridget task status '<task_id>'
bridget task ack '<task_id>'

bridget task continue, respond et cancel couvrent la suite du cycle. Ajouter --json pour un script. La propriété reste liée à l’agent coordinateur. Un terminal sans identité d’agent reçoit un refus et une instruction de rattachement. T3 reste un client possible. Il n’est pas requis.

Ce que Bridget sait faire

Se trouver. Un annuaire vivant : nom, fournisseur, modèle, effort, disponibilité, domaine. Un agent peut se renommer, se déclarer « ne pas déranger » ou changer de domaine, mais seulement pour lui-même. who et agents visent le même projet par défaut ; --global ouvre une vue globale volontaire, pas un mandat d'envoi. Un client autonome fournit --project-root ; sans preuve, son projet reste inconnu, sans suggestion locale. Le domaine d'affichage ne prouve pas l'appartenance au projet.

Se parler sans se perdre. Envoi idempotent avec reçu, réponses liées à leur question, demandes suivies avec rappels et escalade, annulation propre. Un disjoncteur coupe les échanges qui s'emballent et le pont T3 ne relaie que les réponses attendues : deux agents ne peuvent plus se répondre en boucle. Les en-têtes de transport conservent le nom humain et l'UUID complet ; le nom ne change ni le routage ni les droits. Le rendu T3 compact (139–141) conserve le texte reçu. Les lots de messages directs affichent les noms et un début de corps littéral dans des sections repliables, sans panneau source. La copie garde le lot original. Les notifications conservent leur présentation. Ce rendu est validé ; cette documentation ne prouve pas son activation dans une application T3 déjà ouverte. Un sous-agent interne T3 attesté utilise seulement MCP bridget_who et bridget_send, avec la provenance du sous-agent et l'identité du parent. La réponse revient au parent, pas au sous-agent. Pour un autre projet connu, ajouter --cross-project-reason 'motif volontaire' ; MCP utilise cross_project_reason. L'avertissement revient au caller, hors du corps, sans seconde confirmation humaine. Un échange legacy de projet inconnu reste possible avec avertissement, jamais déclaré local.

Discuter à plusieurs sans gaspiller. Les fils partagés (2 à 16 membres) sont des carnets communs : écrire est silencieux, la sollicitation est ciblée, la lecture est incrémentale avec un signet par membre. Trois agents qui échangent dix fois consomment quelques tours, pas soixante. kind:history conserve une preuve sans sollicitation ; action, blocker et decision portent des consignes courtes. supersedes_seq remplace explicitement une consigne du même auteur et des mêmes cibles. L'histoire reste lisible ; notify:[] n'est pas privé : tous les membres peuvent lire.

Dans T3, le panneau Bridget permet à l'humain de consulter les fils accessibles à la conversation ouverte. Les fils récemment actifs et leurs derniers messages apparaissent en haut. Les corps longs se déplient ; la copie garde le texte complet. La recherche couvre seulement les données chargées, y compris les portions repliées. Charger les messages plus anciens complète cette vue, sans ACK, notification ni relance d'agent. Ce panneau reste distinct de la lecture métier des agents. Les versions T3 et daemon Bridget doivent être mises à jour ensemble. Une installation sur disque ne modifie pas les processus déjà ouverts : l'activation exige leur prochain redémarrage.

Se passer le relais. Le dossier de passation transporte objectif, résumé, décisions, questions, prochain pas et références. Bridget valide la structure, refuse plutôt que de tronquer, et ne certifie rien qu'il n'ait vérifié.

Déléguer depuis le terminal. Un agent coordinateur peut appeler bridget delegate avec la seule mission. Bridget applique sa politique existante, crée l’enfant et rend un identifiant durable. Le groupe bridget task suit, attend, continue, répond, annule et accuse lecture avec les mêmes états que MCP. Aucun coordinateur T3 n’est nécessaire.

Retrouver. Recherche bornée et reprenable dans ses propres échanges ou dans un fil, accents et casse repliés, curseur pour continuer, relecture exacte par fragments avec empreinte SHA-256. Une recherche est partielle par construction : Bridget vous le dit, au lieu de vous laisser croire que vous avez tout vu.

Observer sans deviner. Extraits de journal partageables, abonnements aux fins de tour, aux demandes de permission et aux écritures concurrentes, artefacts publiés inertes et relus par référence exacte. Les abonnements survivent à un redémarrage du daemon, et l'état d'une source n'est annoncé qu'une fois stable : chaque avis réveille un agent, Bridget n'en envoie donc pas pour rien. Une observation est un fait, pas une nouvelle mission ni une demande de réponse inter-agent. Une fin de tour ne prouve pas la fin du travail. Le contrôleur Agent Loop reste extérieur à Bridget : il suit prise en charge, progrès vérifiable et décision de suite, avec rappels regroupés et clôture explicite. Il ne recrute pas ailleurs par défaut. Worker, coordinateur et ROOT déjà mandatés par UUID/rôle/motif gardent leurs rappels ; ROOT extérieur sans mandat crée une décision visible.

S'étendre. Fédération SSH entre serveurs, adaptateur T3 Code pour les fils de bureau, pilotes natifs Claude et Codex sans tmux, protocole public pour les services extérieurs comme le service compagnon. Le pont T3 Code relie chaque réponse au tour que la demande a réellement déclenché, suit aussi les tours spontanés, et signale une seconde application T3 qui partagerait les mêmes données.

Ce que Bridget refuse de faire, et c'est voulu

  • Inventer un succès. Une coupure est une indisponibilité, jamais un historique vide. Un reçu outcome_unknown se rejoue, il ne se réécrit pas.
  • Deviner une identité. Aucun paramètre agent_id ne donne de droits. La portée vient de la connexion attestée ; un curseur, un fichier ou un nom ne suffisent jamais.
  • Exécuter ce qu'il transporte. Un extrait, un lien ou un chemin cité dans un message est une donnée inerte, affichée neutralisée, jamais ouverte.
  • Prendre les décisions humaines. Bridget n'orchestre pas, n'approuve pas, ne lance un équipier que sur demande explicite. Les agents restent responsables de ce qu'ils font de l'information.
  • Sortir de votre machine sans vous. Pas de serveur HTTP public, pas de compte, pas de télémétrie. L'état vit dans un répertoire privé en 0600 ; la fédération passe par votre SSH.

Sous le capot

   Claude Code ─┐                                   ┌─ bridget who / send / thread / ledger (CLI)
   Codex ───────┤   socket Unix, JSONL, identité    │
   Cursor (T3) ─┼──────── attestée par connexion ───┤   daemon Rust ── SQLite (WAL, 0600)
   Gemini ──────┤                                   │        │
   le service compagnon ──────┘                                   └─ MCP : outils Bridget, schémas fermés
                                                             │
                                          fédération SSH ────┘──── autre machine, même protocole

Trois crates : bridget-core (message, canon), bridget-transport (protocole, JSONL, pilotes), bridget-daemon (daemon, CLI, MCP, magasins). Tout est borné : tailles de trame, pages, corps, fils, budgets de travail par appel. Tout est typé : chaque refus a un code et une raison, jamais un silence.

Qualité

La validation isolée de la session138 compte 1 633 tests Rust réussis et 55 ignorés, plus 152 tests Python Agent Loop réussis (124 existants et 28 nouveaux). Les 63 tests138 propres sont un sous-ensemble, pas un total à ajouter. La recette réelle CLI/MCP/Loop passe ; fmt, clippy -D warnings et release passent. Chaque session conserve ses artefacts et ses revues. La revue138 est indépendante mais du même fournisseur ; aucun succès n'est attribué aux 29 scénarios Gherkin seulement rédigés. Les décisions d'architecture sont historisées dans docs/decisions (50 documents à ce jour).

Aller plus loin

Licence

MIT. Voir LICENSE.

About

Le standard téléphonique de vos agents IA. Daemon local, CLI et MCP pour faire coopérer Claude, Codex, Cursor et Gemini : annuaire, messages avec reçu, fils partagés, passation, recherche. Rust, local-first, sans cloud.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages