Модуль supervisor — надзор за дочерними агентами

🟢 Модуль даёт родительскому агенту запускать дочерних агентов, подписываться на выбранные события своих детей и получать инъекцию в собственный контекст, когда событие совпало — по желанию приостанавливая ребёнка. Хуки в ребёнке не нужны: это внешний control-plane поверх шины событий (events.subscribers) и публичного порта agent_os.Agents.

Инструмент supervisor

Один инструмент kind: supervisor с полем action:

action Поля Что делает
spawn template, task?, session_key? неблокирующий запуск ребёнка; возвращает pid
subscribe event?, inject, child?, role?, pause_child?, resume_after?, run_turn?, once? подписка родителя на события ребёнка; возвращает id
unsubscribe id снять подписку
subscriptions — список активных подписок
send pid, content, role? впрыснуть сообщение ребёнку
pause / resume pid приостановить/возобновить ребёнка
stop pid, signal? pause | interrupt | terminate (по умолчанию interrupt)
status pid снимок процесса ребёнка
session pid, limit? живая сессия бегущего ребёнка: последние сообщения его контекста (role, content, tool_call_id, tool_calls); limit по умолчанию 50

Подписка и доставка

Поставляемый агент observer

Модуль поставляет config-бандлом готового агента-наблюдателя observer (agents/observer/): он объявляет tool_files: [tools/supervisor.yaml] и владеет всеми действиями supervise — spawn, subscribe, session, send, pause/resume/stop. Загружается рядом с config/agents/ при включённом модуле (одноимённый агент из config/agents побеждает). Типовой сценарий: observer запускает coder и следит за его падениями.

Пример

Инструмент можно объявить и в своём агенте:

# config/agents/supervisor-agent/tools/supervisor.yaml
kind: supervisor
name: supervise
description: Запускай код-агента и следи за его падениями.
  1. { "action": "spawn", "template": "coder", "task": "Почини сборку" } → pid.
  2. { "action": "subscribe", "child": "<pid>", "event": { "kind": "tool_result", "success": false }, "inject": "Упало: {{ event.content }}. Помоги исправить.", "pause_child": true, "resume_after": true, "run_turn": true }.
  3. Родитель работает независимо; при падении ребёнка получает инъекцию в свой контекст (ребёнок опционально на паузе).
  4. { "action": "session", "pid": "<pid>", "limit": 50 } — посмотреть, что ребёнок делает прямо сейчас.

Глобальные правила (альтернатива)

Для декларативных правил без привязки к конкретному родителю есть модуль reactions: действия inject (в т.ч. target: parent) и signal позволяют уведомлять/останавливать процесс из правила.