pending_approval, шлюз удерживает
вызов инструмента и уведомляет вашу собственную систему подтверждений вне
основного канала. Это уведомление — подписанный HTTP POST, полезная нагрузка
вебхука firewall, и эта страница документирует её точную форму, чтобы вы могли
проверить подпись, маршрутизировать событие и запостить своё решение обратно.
Это асинхронный собрат in-console потока подтверждений, описанного на странице
Firewall. Консольный путь (ревьюер
кликает approve/reject) не нуждается в вебхуке вообще. Вебхук — для случая, когда
вы хотите, чтобы машина — ваш собственный тикетинг-бот, Slack-действие или
рантайм агента — разрешила удержание. Оба пути first-writer-wins, так что вы
можете запускать их бок о бок.
Вебхук — это best-effort сигнал маршрутизации, а не авторитетный HITL-канал.
Собственный long-poll агента на
GET /api/v1/firewall/approvals/:id —
это подстраховка: если уведомление потеряно или ваш эндпоинт ненадолго лежит,
удержанный вызов всё равно появляется в консоли и разрешается нормально. Вебхук
просто позволяет машине среагировать быстрее, чем это сделал бы человек.1. Полезная нагрузка вебхука firewall с первого взгляда
OrcaRouter POST’ит JSON-конверт на URL, который вы настраиваете, подписанный общим секретом. Вот полная доставка — заголовки и тело:X-Orca-Event, не парся тело.
2. Поля конверта
event — имя события
event — имя события
Всегда
firewall.approval.pending для удержания подтверждения. Зеркалится в
заголовке X-Orca-Event, так что вы можете маршрутизировать до парсинга тела.workspace_id — рабочее пространство-источник
workspace_id — рабочее пространство-источник
Целочисленный id рабочего пространства, чья политика удержала вызов. Полезно,
когда один эндпоинт получает вебхуки от нескольких рабочих пространств.
occurred_at — когда удержание было создано
occurred_at — когда удержание было создано
Timestamp RFC 3339 / UTC (наносекундная точность) для момента, когда шлюз
поставил подтверждение в очередь. Парсится любым стандартным
событийным инструментарием.
data — полезная нагрузка подтверждения
data — полезная нагрузка подтверждения
Блок, который нужен вашему колбэку, чтобы разрешить гейт. Поля в
§3.
3. Полезная нагрузка data
Блок data несёт всё нужное для маршрутизации и разрешения удержания —
намеренно без аргументов инструмента. Вебхук — сигнал маршрутизации; полный
контекст вызова (инструмент, аргументы, сработавшее правило) живёт на консольной
вкладке Approvals и в журнале аудита, где он защищён доступом.
| Поле | Тип | Значение |
|---|---|---|
approval_id | string | Id, против которого вы постите своё решение. |
tool_name | string | Удержанный инструмент, например db.export. |
request_id | string | Relay-запрос, который вызвал удержание. |
conversation_id | string | Id диалога / сессии агента. |
policy_id | int | Политика firewall, которая совпала. |
rule_id | int | Правило, вернувшее pending_approval. |
4. Проверка подписи
Каждая доставка подписана, так что вы можете отклонять подделки. Заголовок подписи:secret — секрет вебхука подтверждений, который вы задали на рабочем
пространстве, а raw_body — точные байты тела запроса. Вычислите HMAC по
сырым байтам — повторная сериализация распарсенного JSON изменит пробелы и
сломает сравнение. Проверяйте за постоянное время:
5. Настройка вебхука
URL назначения и общий секрет — настройки рабочего пространства; задайте их один раз в консоли (или через settings API; Developer+). Нет участия оператора и нечего деплоить.Задайте URL и секрет
В настройках Firewall задайте ваш HTTPS-эндпоинт как URL вебхука подтверждений
и сильный общий секрет. URL должен быть
https:// — plaintext-назначения
отклоняются — а секрет write-only (он никогда не возвращается при чтении;
ответ настроек сообщает только, задан ли он).Создайте правило pending_approval
Добавьте правило Firewall, чей вердикт —
pending_approval (или используйте
пресет HITL). См. Правила Firewall.Получите и проверьте
Ваш эндпоинт получает подписанный POST на следующем удержанном вызове.
Проверьте подпись (§4), затем либо разрешите
через колбэк, либо покажите её человеку.
Удержанный вызов всё равно работает без настроенного вебхука — он просто
показывается в консоли для разрешения человеком. И если вы задали URL, но не
секрет, шлюз пропускает диспетч целиком, потому что эндпоинт колбэка принимает
только подписанные запросы: уведомление, которое вы не смогли бы
аутентифицировать в ответ, было бы бесполезным.
6. Колбэк: разрешение удержания
Чтобы одобрить или отклонить машиной, запостите обратно на::id, что вы получили как approval_id, подписанным тем же общим
секретом. Тело — это решение:
| Поле тела | Обязательно | Значения |
|---|---|---|
decision | да | approved или rejected |
reason | нет | Свободная заметка, записывается в журнал аудита. |
approved пропускает следующую попытку агента один раз — агент
переотправляет исходный вызов с одноразовым заголовком
X-OrcaRouter-Firewall-Approval. Решение rejected оставляет вызов
заблокированным.
Разрешение идемпотентно и first-writer-wins. Если человек уже разрешил
удержание из консоли — или приходит дублирующий колбэк — эндпоинт возвращает
200 с already_resolved: true, и исходное решение остаётся в силе. Безопасно
повторять.7. Состояния подтверждения
Удержанный вызов проходит через эти состояния; ваш колбэк управляет переходом изpending:
| Состояние | Значение |
|---|---|
pending | Ожидает решения (состояние на момент вебхука). |
approved | Разрешено — закрытый гейтом вызов может пройти один раз. |
rejected | Разрешено — закрытый гейтом вызов остаётся заблокированным. |
expired | Удержание устарело без решения. |
8. Сопутствующие справочники
Firewall — поток HITL
Как
pending_approval удерживает вызов, и агент переотправляет с одноразовым
заголовком подтверждения.Коды ошибок
firewall_approval_pending и другие HTTP-ответы firewall.Глоссарий вердиктов
Каждый вердикт firewall, включая
pending_approval.Firewall API
Полный справочник консольных маршрутов + маршрутов шлюза.
