Guardian はエージェントと一緒に動く軽量な Node.js プロセスです。AI なし、ゼロトークンで、仕事は 1 つだけ:エージェントをオンラインに保ち、チャットから管理できるようにする。

何を見るか

30 秒ごとに Guardian は:

  • エージェントのセッションに対して tmux capture-pane -p を実行
  • キャプチャした出力でエラーパターン(API Error:OverloadedCould not process など)をスキャン
  • ← discord← telegram などでタグ付けされた受信メッセージを探して、エージェントがトラフィックを受信しているか確認
  • 「作業中」のインジケータ(Baked、Crunching、tool-use マーカー)をチェックして、ハングとアイドルを区別

セッションが死んでいれば再起動します。エラーが溜まっていて作業も起きていなければ、エージェントをハング状態としてマークし、もう 1 回失敗チェックの後で再起動します。

再起動ポリシー

  • 30 分あたり最大 3 回の再起動。 それを超えると Guardian は試行を止めて、あなたのチャンネル経由で呼び出します。
  • すべての再起動は ~/workspace/memory/guardian.log にログ出力され、状態は /tmp/sento-guardian-<agent>.json に書かれます。
  • クリーンな再起動時、Guardian は ✅ 通知を送信:「エージェントが戻りました。」

チャンネルペイジング

Guardian はエージェントが使うチャンネル(Discord、Telegram、Slack)を検出し、プラグインの .env ファイルから bot トークンを読み、対応する API を使って直接メッセージを送ります:

  • Discord:設定されていれば webhook、それ以外はモニターチャンネルへ Bot API
  • Telegram:モニターチャット ID への sendMessage
  • Slack:モニターチャンネルへの chat.postMessage

チャットからの対話コマンド

Guardian はモニターチャンネルのユーザーメッセージもポーリングするので、SSH なしでエージェントを管理できます:

  • restart — Guardian がエージェントを停止して再起動、再起動カウントをリセット
  • logs — tmux 出力の直近 15 行をチャンネルに投げ戻す
  • status — 健康サマリ(生存 / ハング / 再起動数 / 状態)を出力

なぜ AI なしか

AI があるものは何でも失敗するからです。Guardian の全ての存在意義は、エージェントが生きていない時に生きているものになることです。Node.js、正規表現、tmux capture-pane。これがスタック全体。

知っておくべきファイル

  • Sentō repo の src/templates/guardian.js — Guardian テンプレート(エージェントごとにレンダリング)
  • ~/workspace/memory/guardian.log — Guardian のログ出力
  • /tmp/sento-guardian-<agent>.json — 永続状態(再起動リスト、状態フラグ)
  • ~/.claude/channels/<channel>/.env — Guardian が起動時に読んでトークンを取得

起動と永続化の仕組み

  • インストール時:sento initnohup node guardian.js & で Guardian を起動し、再起動時に戻ってくる @reboot cron 行を追加。
  • 再起動時:cron エントリがスタートスクリプトを再実行、Guardian が起動、エージェントが起動。
  • デフォルトで systemd なし、launchd なし — nohup + tmux + cron がディストリビューションとコンテナを越えて最もシンプルで信頼できるパターン。