Sentō は、エージェント間(A2A)メッセージングを一等機能として内蔵した最初のエージェントフレームワークです。2 つのエージェントが一度ペアリングし、共有秘密を交換すると、それ以降は HTTP 経由で互いに署名付きメッセージを送れます。
中央サーバーなし。pub/sub ブローカーなし。ホストされたディレクトリなし。HTTP エンドポイントと共有 HMAC secret を持つ 2 つの Linux プロセスだけ。
なぜこれがあるか
実際のユースケース:
- Mira(マーケティング)が Kai(個人)のデータを必要とする:Mira が Kai にメッセージ、「今週 Gabriel が言ったタスクは何?」 Kai が関連するメモリで返信。
- Blair(家事)が Porter(メール処理)に警告:Blair が新しいフォームについての学校メッセージを見て、Porter がスキャンとファイリングを処理。
- 負荷分担:1 つのエージェントがサブタスクを別の専門エージェントに渡す。
A2A がなければ、すべての調整にあなたが橋渡しとして必要。これがあれば、エージェントは直接協力できます。
ペアリングの仕組み
# エージェント A で
sento pair
→ エージェントがコードを表示:SENTO-4F2K
→ エージェントが言う「相手のエージェントのオーナーに `sento pair SENTO-4F2K` を実行してもらって」
# エージェント B で
sento pair SENTO-4F2K
→ A のオーナーがチャットで見る:「エージェント B がペアリングを希望。承認?(yes/no)」
→ A のオーナーがタイプ:yes
→ 両エージェントが HMAC secret を交換
→ ペアリングが両側の ~/.sento-config.json に保存
これで A と B は HTTP 経由で互いにメッセージを送れます。
トランスポート
各エージェントの Guardian は自動選択されたポート(9876、9877、9878...)で HTTP リスナーを動かします。メッセージは以下を持つ POST リクエスト:
X-Sento-Signature:共有 secret を使った body の HMAC-SHA256X-Sento-Timestamp:RFC3339 タイムスタンプ、5 分以上古いと拒否- レート制限:ペアあたり 10 リクエスト/分、超えると 429
配信されたメッセージは、← agent <名前> でタグ付けされた受信チャットメッセージかのように、対象エージェントの tmux セッションにパイプされます。
セキュリティモデル
- 相互同意:ペアリングには受信側エージェントの オーナー によるチャットでの承認が必要。エージェントは自動受諾できません。
- HMAC 署名:共有 secret なしで偽造されたメッセージは拒否。
- タイムスタンプウィンドウ:リプレイ攻撃は 5 分後に失敗。
- レート制限:挙動不審または侵害されたエージェントは別のエージェントを洪水させられません。
- 承認したペアリングのみリッスン:未知の送信者は Claude Code が見る前に HTTP 層でドロップ。
一覧とペア解除
sento agents # ペア済みエージェント + ポート + 最終連絡時刻を一覧
sento agents remove kai # ペアリングを取り消し;私たちの側の secret をローテート
何のメッセージを送れるか
テキストなら何でも。一般的なパターン:
- 質問 / 回答(「HN の最新トップストーリーは?」)
- 構造化タスクのハンドオフ(「この請求書をスキャンして:<パス>」)
- ステータス ping(「いる?」)
対象エージェントは通常の受信メッセージとしてテキストを受け取り、人間のオーナーに応答するのと同じように応答します。ただし応答は Discord/Telegram/Slack ではなく A2A チャンネル経由で戻ります。
コードを読むなら
src/templates/guardian.js— HTTP サーバ実装src/commands/pair.js— ペアリングフローsrc/commands/agents.js— 一覧 + 削除