Skip to content

Хуки Bot ​

Хуки позволяют Bot выполнять небольшие правила автоматизации вокруг инструментов, ходов разговора, памяти, активности рабочего пространства, подтверждений, сжатия контекста и субагентов. Они настраиваются для каждого Bot в файле рабочего пространства:

text
/data/.memoh/hooks.json

Откройте страницу Detail Page нужного Bot и перейдите на вкладку Hooks, чтобы редактировать этот файл из UI.


Вкладка Hooks ​

Вкладка Hooks — это JSON-редактор конфигурации хуков Bot. Она умеет:

  • показывать, существует ли /data/.memoh/hooks.json
  • показывать, включена ли пользовательская конфигурация
  • считать включённые хуки и действия
  • выводить каталог поддерживаемых событий
  • показывать, какие события подключены к среде выполнения
  • перезагружать и сохранять JSON-конфигурацию
  • вставлять стартовый шаблон
  • прогонять синтетическое событие через действующую конфигурацию хуков

Если файла нет, UI и сервис создают пустую включённую конфигурацию:

json
{
  "version": 1,
  "enabled": true,
  "hooks": []
}

Визуального конструктора правил на вкладке нет. Редактируйте JSON напрямую.


Структура конфигурации ​

json
{
  "version": 1,
  "enabled": true,
  "defaults": {
    "timeout": "10s",
    "on_error": "fail",
    "max_output_bytes": 65536,
    "trigger_nested_hooks": false
  },
  "env": {
    "HOOK_LOG": "/data/.memoh/hooks.log"
  },
  "hooks": [
    {
      "name": "review shell commands",
      "event": "PreToolUse",
      "matcher": "^exec$",
      "enabled": true,
      "priority": 10,
      "actions": [
        {
          "type": "command",
          "command": "python3 /data/.memoh/review-command.py",
          "timeout": "5s",
          "on_error": "block"
        }
      ]
    }
  ]
}

Поля верхнего уровня:

ПолеОписание
versionОбязательная версия схемы. Текущая версия — 1.
enabledВключает или выключает хуки в этой пользовательской конфигурации. По умолчанию true.
defaults.timeoutТаймаут действия по умолчанию. Принимает длительности в стиле Go, такие как 10s, или целое число секунд. По умолчанию 10s.
defaults.on_errorПоведение при ошибке по умолчанию: ignore, fail или block. По умолчанию fail.
defaults.max_output_bytesМаксимум захватываемых байт stdout/stderr на одно действие типа command. По умолчанию 65536.
defaults.trigger_nested_hooksРазбирается схемой, по умолчанию false; отдельного элемента управления в UI хуков пока нет.
envДополнительные переменные окружения для действий типа command из пользовательской конфигурации.
hooksУпорядоченный список правил. Сработавшие хуки выполняются по убыванию priority; при равном приоритете сохраняется порядок в файле.

Поля хука:

ПолеОписание
nameНеобязательное имя для отображения и отладки.
eventОбязательное имя события из каталога.
matcherНеобязательное регулярное выражение. Сопоставляется с наиболее подходящим целевым текстом запроса.
enabledВключает или выключает этот хук. По умолчанию true.
priorityБольшие числа выполняются первыми.
actionsДействия, выполняемые при срабатывании хука.
conditionsПрисутствует в схеме для будущего расширения; сейчас при сопоставлении используются event, enabled и matcher.

Цель для matcher выбирается из запроса хука в таком порядке:

  • tool.name
  • approval.tool_name
  • channel.platform
  • memory.scope
  • extra.command, extra.path, extra.operation или extra.scope
  • имя события

Типы действий ​

Поддерживаются два типа действий: command и tool.

Действие command ​

json
{
  "type": "command",
  "command": "mkdir -p .memoh && cat >> .memoh/hooks.log",
  "work_dir": "/data",
  "timeout": "10s",
  "on_error": "ignore"
}

Действие command выполняется внутри контейнера рабочего пространства Bot. Запрос хука передаётся как JSON на stdin, с завершающим переводом строки.

Рабочий каталог определяется так:

  1. action.work_dir
  2. текущий каталог рабочего пространства из запроса
  3. /data

Переменные окружения включают:

  • env верхнего уровня из действующей конфигурации
  • MEMOH_HOOK_EVENT
  • MEMOH_HOOK_NAME
  • MEMOH_BOT_ID
  • MEMOH_SESSION_ID

Если stdout — это JSON, команда может вернуть:

json
{
  "decision": "append_context",
  "reason": "extra context added",
  "append_context": "Use the production-safe command variant.",
  "metadata": {
    "source": "hook"
  }
}

Если stdout — не JSON, Memoh трактует действие как allow и сохраняет «сырой» stdout в метаданных действия. Ненулевой код выхода — это ошибка действия.

Действие tool ​

json
{
  "type": "tool",
  "tool": "record_event",
  "input": {
    "source": "hook"
  },
  "timeout": "10s",
  "on_error": "fail"
}

Действие tool вызывает доступный инструмент Bot по имени с настроенным input. Результаты инструмента могут вернуть decision, reason и append_context в объектном результате.

mcp_tool зарезервирован в кодовой базе, но сейчас отклоняется.


Решения и ошибки ​

Действия могут возвращать одно из таких решений:

РешениеЭффект
allowПродолжить как обычно.
denyЗапретить охраняемую операцию. Для PreToolUse это отклоняет вызов инструмента.
ask_approvalЗапросить подтверждение человека там, где среда выполнения поддерживает передачу на подтверждение.
append_contextДобавить контекст там, где интеграция события потребляет append_context, например в потоках, связанных с промптом, моделью или памятью.

on_error управляет тем, что происходит при сбое действия:

ЗначениеЭффект
ignoreЗаписать в лог и перейти к следующему действию.
failВернуть ошибку действия. Это значение по умолчанию.
blockПревратить сбой в решение deny.

Каталог событий ​

Вкладка Hooks загружает каталог событий из /bots/{bot_id}/hooks/events. События, помеченные как поддерживаемые средой выполнения, подключены к текущим путям исполнения. События «только в каталоге» принимаются разбором конфигурации и тестовыми запусками, но живой путь среды выполнения их пока не порождает.

СобытиеОбластьПоддержано средой выполненияПримечания
PreToolUseИнструментыДаВыполняется до решения о подтверждении вызова инструмента. Может запретить или запросить подтверждение.
PostToolUseИнструментыДаВыполняется после успешного вызова инструмента.
ToolErrorИнструментыДаВыполняется, когда вызов инструмента возвращает ошибку.
SessionStartСессияДаВыполняется после создания сессии.
UserMessageReceivedРазговорДаВыполняется после того, как резолвер разговора получил входящее сообщение пользователя.
BeforePromptBuildПромптДаВыполняется до сборки промпта; append_context может добавляться в системный промпт.
AfterPromptBuildПромптДаВыполняется после сборки промпта; append_context может добавляться в системный промпт.
BeforeModelCallМодельДаВыполняется перед шагами генерации модели; append_context может добавляться как сообщение пользователя.
AfterModelCallМодельДаВыполняется после шагов генерации модели.
TurnEndХодДаВыполняется по завершении хода.
TurnErrorХодДаВыполняется при сбое хода.
BeforeMemorySearchПамятьДаВыполняется перед поиском в памяти.
AfterMemorySearchПамятьДаВыполняется после поиска в памяти; append_context может вливаться в контекст памяти.
BeforeMemoryWriteПамятьДаВыполняется перед записью памяти разговора.
AfterMemoryWriteПамятьДаВыполняется после записи памяти.
MemoryExtractedПамятьДаВыполняется после извлечения памяти и подготовки записи.
WorkspaceStartРабочее пространствоДаВыполняется после запуска рабочего пространства.
WorkspaceStopРабочее пространствоДаВыполняется при остановке рабочего пространства.
BeforeWorkspaceCommandРабочее пространствоДаВыполняется перед shell-командами рабочего пространства. Может запретить команду.
AfterWorkspaceCommandРабочее пространствоДаВыполняется после shell-команд рабочего пространства.
BeforeFileWriteРабочее пространствоДаВыполняется перед записью файлов и патчами. Может запретить запись.
AfterFileWriteРабочее пространствоДаВыполняется после записи файлов и патчей.
BeforeApprovalCreateПодтвержденияДаВыполняется перед созданием запроса на подтверждение инструмента.
ApprovalRequestedПодтвержденияДаВыполняется после того, как подтверждение запрошено.
ApprovalResolvedПодтвержденияДаВыполняется после того, как по подтверждению принято решение.
ApprovalTimeoutПодтвержденияДаВыполняется, когда подтверждение истекает по таймауту.
PreCompactСжатиеДаВыполняется перед сжатием сессии.
PostCompactСжатиеДаВыполняется после сжатия сессии.
SubagentStartСубагентыДаВыполняется перед запуском задачи субагента.
SubagentStopСубагентыДаВыполняется после остановки задачи субагента.
InboundMessageNormalizedСообщенияНетПока только в каталоге.
BeforeOutboundMessageСообщенияНетПока только в каталоге.
AfterOutboundMessageСообщенияНетПока только в каталоге.
ChannelDeliveryFailedСообщенияНетПока только в каталоге.

Тестирование хуков ​

Используйте раздел Test на вкладке Hooks, чтобы прогнать синтетическое событие:

  1. Выберите событие.
  2. Отредактируйте JSON-нагрузку.
  3. Нажмите Run Test.
  4. Изучите возвращённый результат: сработавшие хуки, выполненные действия, решение, результаты действий и метаданные источника хуков.

Тестовый путь использует действующую конфигурацию и выполняет настоящие действия. Не включайте в тестовые нагрузки разрушительные команды и вызовы инструментов — если только это не то, что вы намерены проверить.


Замечания о безопасности ​

Хуки выполняются внутри рабочего пространства Bot. Относитесь к ним как к любому другому коду, который там работает.

  • Просматривайте каждое действие типа command перед включением.
  • Будьте осторожны с PreToolUse, BeforeWorkspaceCommand и BeforeFileWrite: они могут заблокировать нормальную работу Bot.
  • Держите таймауты короткими и задавайте on_error осознанно.
  • Не храните долгоживущие секреты прямо в hooks.json.
  • Для рискованных хуков предпочитайте узкие выражения matcher.
  • Помните, что действия типа command получают запрос хука на stdin, а в нём могут быть текст сообщений, входные данные инструментов, пути и ошибки.

Связанные страницы ​

Published under AGPLv3