Guardian はエージェントと一緒に動く軽量な Node.js プロセスです。AI なし、ゼロトークンで、仕事は 1 つだけ:エージェントをオンラインに保ち、チャットから管理できるようにする。
何を見るか
30 秒ごとに Guardian は:
- エージェントのセッションに対して
tmux capture-pane -pを実行 - キャプチャした出力でエラーパターン(
API Error:、Overloaded、Could 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 initがnohup node guardian.js &で Guardian を起動し、再起動時に戻ってくる@rebootcron 行を追加。 - 再起動時:cron エントリがスタートスクリプトを再実行、Guardian が起動、エージェントが起動。
- デフォルトで systemd なし、launchd なし — nohup + tmux + cron がディストリビューションとコンテナを越えて最もシンプルで信頼できるパターン。