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-SHA256
  • X-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 — 一覧 + 削除