Guardian 是跟着你智能体跑的一个轻量 Node.js 进程。它没有 AI,用零 token,工作只有一个:让智能体保持在线,让你从聊天里管理它。

它看什么

每 30 秒,Guardian:

  • 对智能体的 session 运行 tmux capture-pane -p
  • 扫描抓到的输出找错误模式(API Error:OverloadedCould not process 等)
  • 找标了 ← discord← telegram 等的入站消息,知道智能体在接流量
  • 检查"正在工作"的指示(Baked、Crunching、tool-use 标记)以区分"卡住"和"空闲"

如果 session 死了,它重启。如果错误在堆积、也没在工作,它把智能体标成卡住,再挂一次检查就重启。

重启政策

  • 每 30 分钟最多 3 次重启。 超过之后,Guardian 停止尝试,通过你的频道找你。
  • 每次重启都写到 ~/workspace/memory/guardian.log,状态写到 /tmp/sento-guardian-<agent>.json
  • 干净重启后,Guardian 发一个 ✅ 通知:"智能体回来了。"

通过频道寻呼

Guardian 检测你智能体用的频道(Discord、Telegram 或 Slack),从插件的 .env 文件读 bot token,用对应的 API 直接发消息给你:

  • Discord:配好的话用 webhook,否则用 Bot API 发到监控频道
  • Telegram:sendMessage 到你的监控 chat ID
  • Slack:chat.postMessage 到你的监控频道

从聊天里的交互命令

Guardian 还会轮询监控频道里用户的消息,所以你不用 SSH 就能管理智能体:

  • restart —— Guardian 停止并重启智能体,重置重启计数
  • logs —— 把 tmux 输出的最后 15 行扔回频道
  • status —— 打印健康摘要(活着 / 卡住 / 重启计数 / 状态)

为什么没 AI

因为任何带 AI 的东西都会失败。Guardian 的全部意义就是在智能体不活着的时候它还活着。Node.js、regex、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 启动时读来拿 token

怎么启动和持久化

  • 安装时:sento init 通过 nohup node guardian.js & 启动 Guardian,并加一行 @reboot 的 cron,重启后回来。
  • 重启时:cron 项重新运行启动脚本,Guardian 启动,智能体启动。
  • 默认没 systemd、没 launchd —— nohup + tmux + cron 是跨发行版和容器里最简单可靠的模式。