Skip to content

Bot Hooks ​

Bot Hooks を使うと、ツール呼び出し、会話の turn、メモリ、ワークスペースの活動、承認、圧縮、subagent といったフローの前後で、Bot に小さな自動化ルールを実行させられます。各 Bot は自分専用の設定ファイルを持ちます:

text
/data/.memoh/hooks.json

Bot の詳細ページを開いて Hooks タブに進むと、このファイルを UI から編集できます。


Hooks タブ ​

Hooks タブは、Bot の hook 設定の JSON エディターです。できることは次のとおりです:

  • /data/.memoh/hooks.json が存在するかの表示
  • ユーザー設定が有効かの表示
  • 有効な hook と action の数の集計
  • サポートされているイベントカタログの一覧表示
  • どのイベントがランタイムに接続済みかの表示
  • JSON 設定の再読み込みと保存
  • スターターテンプレートの挿入
  • 合成イベント 1 件で現在の effective hooks 設定をテスト

ファイルが存在しない場合、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必須の schema バージョン。現在のバージョンは 1 です。
enabledこのユーザー設定ファイル内の hooks を有効化・無効化します。デフォルトは true です。
defaults.timeoutデフォルトの action タイムアウト。10s のような Go duration と、整数の秒数の両方をサポートします。デフォルトは 10s です。
defaults.on_errorデフォルトのエラー処理: ignore、fail、block のいずれか。デフォルトは fail です。
defaults.max_output_bytescommand action 1 つあたりで捕捉する stdout/stderr の最大バイト数。デフォルトは 65536 です。
defaults.trigger_nested_hooksschema はこのフィールドを解析し、デフォルトは false です。Hooks UI には現在、専用のコントロールはありません。
envユーザー設定内の command action が使う追加の環境変数。
hooksルールのリスト。マッチした hook は priority の高い順に実行され、同じ優先度ではファイル内の順序が保たれます。

Hook のフィールド:

フィールド説明
name任意の表示/デバッグ用の名前。
event必須。イベントカタログにある名前でなければなりません。
matcher任意の正規表現。リクエスト内の最適なターゲットテキストに対してマッチします。
enabledこの hook を有効化・無効化します。デフォルトは true です。
priority数字が大きいほど先に実行されます。
actionshook がマッチしたときに実行する action。
conditionsschema 内では将来の拡張用に予約されています。現在のマッチングは event、enabled、matcher を使います。

matcher のターゲットテキストは、hook リクエストから次の順序で選ばれます:

  • tool.name
  • approval.tool_name
  • channel.platform
  • memory.scope
  • extra.command、extra.path、extra.operation、または extra.scope
  • イベント名

Action の種類 ​

現在サポートされている action は command と tool の 2 種類です。

Command Action ​

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

command action は Bot のワークスペースコンテナ内で実行されます。hook リクエストは JSON として stdin から渡され、末尾に改行が付きます。

作業ディレクトリの解決順序:

  1. action.work_dir
  2. リクエスト内のワークスペース CWD
  3. /data

環境変数には次が含まれます:

  • 現在の設定のトップレベルにある env
  • MEMOH_HOOK_EVENT
  • MEMOH_HOOK_NAME
  • MEMOH_BOT_ID
  • MEMOH_SESSION_ID

stdout が JSON の場合、command は次を返せます:

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

stdout が JSON でない場合、Memoh はその action を allow として扱い、生の stdout を action metadata に格納します。非ゼロの終了コードは action エラーと見なされます。

Tool Action ​

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

tool action は、利用可能な Bot ツールを名前で呼び出し、設定にある input を渡します。ツールの結果がオブジェクトの場合、decision、reason、append_context を返せます。

mcp_tool はコード内では予約された型ですが、現在は拒否されます。


決定とエラー ​

action は次の decision を返せます:

Decision効果
allow通常どおり続行します。
denyガード対象の操作を拒否します。PreToolUse の場合、そのツール呼び出しを拒否します。
ask_approvalランタイムが承認の引き継ぎをサポートしている箇所で、人間による承認を要求します。
append_contextイベントの接続点が append_context を消費する場合にコンテキストを追加します。たとえば prompt、model、memory 関連のフローです。

on_error は action が失敗したときの挙動を制御します:

値効果
ignore記録して、次の action に進みます。
failaction エラーを返します。デフォルト値です。
block失敗を deny decision に変換します。

イベントカタログ ​

Hooks タブは /bots/{bot_id}/hooks/events からイベントカタログを読み込みます。runtime-supported とマークされたイベントは、現在の実行パスに接続済みです。catalog-only のイベントは設定の解析とテストインターフェースを通りますが、現時点ではそれらを発行する実際のランタイムパスはありません。

Event領域ランタイム接続済み説明
PreToolUseツールはいツール呼び出しの承認決定の前に実行されます。拒否や承認の要求ができます。
PostToolUseツールはいツール呼び出しの成功後に実行されます。
ToolErrorツールはいツール呼び出しがエラーを返したときに実行されます。
SessionStartセッションはいセッションの作成後に実行されます。
UserMessageReceived会話はいconversation resolver がユーザーメッセージを受け取った後に実行されます。
BeforePromptBuildPromptはいprompt の組み立て前に実行されます。append_context を system prompt に追加できます。
AfterPromptBuildPromptはいprompt の組み立て後に実行されます。append_context を system prompt に追加できます。
BeforeModelCallモデルはいモデルの生成 step の前に実行されます。append_context を user message として追加できます。
AfterModelCallモデルはいモデルの生成 step の後に実行されます。
TurnEndTurnはい1 つの turn が完了したときに実行されます。
TurnErrorTurnはい1 つの turn が失敗したときに実行されます。
BeforeMemorySearchメモリはいメモリ検索の前に実行されます。
AfterMemorySearchメモリはいメモリ検索の後に実行されます。append_context をメモリコンテキストにマージできます。
BeforeMemoryWriteメモリはい会話メモリの書き込み前に実行されます。
AfterMemoryWriteメモリはいメモリの書き込み後に実行されます。
MemoryExtractedメモリはいメモリの抽出/書き込み準備の完了後に実行されます。
WorkspaceStartWorkspaceはいワークスペースの起動後に実行されます。
WorkspaceStopWorkspaceはいワークスペースの停止時に実行されます。
BeforeWorkspaceCommandWorkspaceはいワークスペースの shell コマンド実行前に実行されます。コマンドを拒否できます。
AfterWorkspaceCommandWorkspaceはいワークスペースの shell コマンド実行後に実行されます。
BeforeFileWriteWorkspaceはいファイルの書き込みと patch の前に実行されます。書き込みを拒否できます。
AfterFileWriteWorkspaceはいファイルの書き込みと patch の後に実行されます。
BeforeApprovalCreate承認はいツール承認リクエストの作成前に実行されます。
ApprovalRequested承認はい承認リクエストの送信後に実行されます。
ApprovalResolved承認はい承認が処理された後に実行されます。
ApprovalTimeout承認はい承認がタイムアウトしたときに実行されます。
PreCompact圧縮はいセッション圧縮の前に実行されます。
PostCompact圧縮はいセッション圧縮の後に実行されます。
SubagentStartSubagentはいsubagent タスクの開始前に実行されます。
SubagentStopSubagentはいsubagent タスクの終了後に実行されます。
InboundMessageNormalizedメッセージいいえ現在はイベントカタログにのみ存在します。
BeforeOutboundMessageメッセージいいえ現在はイベントカタログにのみ存在します。
AfterOutboundMessageメッセージいいえ現在はイベントカタログにのみ存在します。
ChannelDeliveryFailedメッセージいいえ現在はイベントカタログにのみ存在します。

Hooks のテスト ​

Hooks タブの Test セクションで、合成イベントを 1 件実行できます:

  1. イベントを選びます。
  2. JSON payload を編集します。
  3. Run Test をクリックします。
  4. 返ってきた結果を確認します。マッチした hooks、実行された actions、decision、action results、hook source metadata が含まれます。

テストパスは effective config を使い、action を実際に実行します。破壊的なコマンドやツール呼び出しの検証がまさに目的である場合を除き、テスト payload でそれらをトリガーしないでください。


セキュリティ上の注意 ​

Hooks は Bot のワークスペース内で実際に実行されます。そこで動くコードと同じものとして扱ってください。

  • 有効化する前に、すべての command action をレビューしてください。
  • PreToolUse、BeforeWorkspaceCommand、BeforeFileWrite の使用には注意してください。Bot の通常の作業をブロックしてしまうことがあります。
  • timeout は短く保ち、on_error を明示的に設定してください。
  • 長期間有効な secrets を hooks.json に直接書かないでください。
  • リスクの高い hooks には、できるだけ狭い matcher を使ってください。
  • command action は stdin から hook リクエストを受け取り、そこにはメッセージテキスト、ツール入力、パス、エラー情報が含まれ得ることを覚えておいてください。

関連ページ ​

Published under AGPLv3