メインコンテンツへスキップ

Hooks

Hooksは、Gateway内部で何かが起きたときに実行される小さなスクリプトです。ディレクトリから検出でき、openclaw hooksで確認できます。Gatewayは、hooksを有効にするか、少なくとも1つのhook entry、hook pack、legacy handler、または追加のhook directoryを設定した後にのみ、内部Hooksを読み込みます。 OpenClawには2種類のHooksがあります。
  • 内部Hooks(このページ): /new/reset/stop、またはライフサイクルイベントのようなエージェントイベントが発火したときに、Gateway内で実行されます。
  • Webhooks: 他のシステムがOpenClaw内で処理をトリガーできる外部HTTPエンドポイントです。Webhooksを参照してください。
Hooksはplugin内にバンドルすることもできます。openclaw hooks listには、スタンドアロンのHooksとplugin管理のHooksの両方が表示されます。

クイックスタート

# 利用可能なHooksを一覧表示
openclaw hooks list

# Hookを有効化
openclaw hooks enable session-memory

# Hookの状態を確認
openclaw hooks check

# 詳細情報を取得
openclaw hooks info session-memory

イベントタイプ

Event発火するタイミング
command:new/newコマンドが発行されたとき
command:reset/resetコマンドが発行されたとき
command:stop/stopコマンドが発行されたとき
command任意のコマンドイベント(汎用リスナー)
session:compact:beforeCompactionが履歴を要約する前
session:compact:afterCompactionの完了後
session:patchセッションプロパティが変更されたとき
agent:bootstrapワークスペースのbootstrapファイルが注入される前
gateway:startupチャネルが起動し、Hooksが読み込まれた後
message:received任意のチャネルからの受信メッセージ
message:transcribed音声文字起こしの完了後
message:preprocessedすべてのメディア処理とリンク理解の完了後
message:sent送信メッセージが配信されたとき

Hooksの作成

Hookの構造

各Hookは、2つのファイルを含むディレクトリです。
my-hook/
├── HOOK.md          # メタデータ + ドキュメント
└── handler.ts       # ハンドラー実装

HOOK.md形式

---
name: my-hook
description: "このHookが何をするかの短い説明"
metadata:
  { "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } }
---

# My Hook

ここに詳細なドキュメントを記述します。
メタデータフィールドmetadata.openclaw):
Field説明
emojiCLIに表示する絵文字
events監視するイベントの配列
export使用する名前付きexport(デフォルトは"default"
os必要なプラットフォーム(例: ["darwin", "linux"]
requires必要なbinsanyBinsenv、またはconfigパス
always適格性チェックをバイパスする(boolean)
installインストール方法

ハンドラー実装

const handler = async (event) => {
  if (event.type !== "command" || event.action !== "new") {
    return;
  }

  console.log(`[my-hook] New command triggered`);
  // Your logic here

  // Optionally send message to user
  event.messages.push("Hook executed!");
};

export default handler;
各イベントには、typeactionsessionKeytimestampmessages(ユーザーに送信するにはpush)、およびcontext(イベント固有のデータ)が含まれます。

イベントコンテキストの要点

コマンドイベントcommand:newcommand:reset): context.sessionEntrycontext.previousSessionEntrycontext.commandSourcecontext.workspaceDircontext.cfg メッセージイベントmessage:received): context.fromcontext.contentcontext.channelIdcontext.metadatasenderIdsenderNameguildIdを含むprovider固有データ)。 メッセージイベントmessage:sent): context.tocontext.contentcontext.successcontext.channelId メッセージイベントmessage:transcribed): context.transcriptcontext.fromcontext.channelIdcontext.mediaPath メッセージイベントmessage:preprocessed): context.bodyForAgent(最終的に拡張された本文)、context.fromcontext.channelId Bootstrapイベントagent:bootstrap): context.bootstrapFiles(変更可能な配列)、context.agentId セッションpatchイベントsession:patch): context.sessionEntrycontext.patch(変更されたフィールドのみ)、context.cfg。patchイベントをトリガーできるのは特権クライアントのみです。 Compactionイベント: session:compact:beforeにはmessageCounttokenCountが含まれます。session:compact:afterにはさらにcompactedCountsummaryLengthtokensBeforetokensAfterが追加されます。

Hookの検出

Hooksは、上書き優先順位が低い順から高い順に、次のディレクトリから検出されます。
  1. バンドルされたHooks: OpenClawに同梱
  2. Plugin Hooks: インストール済みplugin内にバンドルされたHooks
  3. 管理対象Hooks: ~/.openclaw/hooks/(ユーザーがインストールし、ワークスペース間で共有)。hooks.internal.load.extraDirsの追加ディレクトリもこの優先順位を共有します。
  4. ワークスペースHooks: <workspace>/hooks/(エージェントごと、明示的に有効化されるまでデフォルトでは無効)
ワークスペースHooksは新しいhook名を追加できますが、同じ名前のバンドル済み、管理対象、またはplugin提供のHooksを上書きすることはできません。 Gatewayは、内部Hooksが設定されるまで、起動時の内部Hook検出をスキップします。openclaw hooks enable <name>でバンドル済みまたは管理対象のHookを有効にするか、hook packをインストールするか、hooks.internal.enabled=trueを設定してオプトインします。1つの名前付きHookを有効にすると、GatewayはそのHookのハンドラーだけを読み込みます。hooks.internal.enabled=true、追加のhook directory、legacy handlerは、広範な検出にオプトインします。

Hook packs

Hook packsは、package.jsonopenclaw.hooksを通じてHooksをexportするnpm packageです。インストール方法:
openclaw plugins install <path-or-spec>
npm specはレジストリ専用です(package名 + 任意の正確なバージョンまたはdist-tag)。Git/URL/file specとsemver rangeは拒否されます。

バンドルされたHooks

HookEvents動作内容
session-memorycommand:new, command:resetセッションコンテキストを<workspace>/memory/に保存
bootstrap-extra-filesagent:bootstrapglob patternから追加のbootstrapファイルを注入
command-loggercommandすべてのコマンドを~/.openclaw/logs/commands.logに記録
boot-mdgateway:startupgateway起動時にBOOT.mdを実行
任意のバンドル済みHookを有効にするには:
openclaw hooks enable <hook-name>

session-memoryの詳細

直近15件のuser/assistantメッセージを抽出し、LLMで説明的なファイル名slugを生成して、<workspace>/memory/YYYY-MM-DD-slug.mdに保存します。workspace.dirの設定が必要です。

bootstrap-extra-files設定

{
  "hooks": {
    "internal": {
      "entries": {
        "bootstrap-extra-files": {
          "enabled": true,
          "paths": ["packages/*/AGENTS.md", "packages/*/TOOLS.md"]
        }
      }
    }
  }
}
パスはワークスペース相対で解決されます。認識されるbootstrap basename(AGENTS.mdSOUL.mdTOOLS.mdIDENTITY.mdUSER.mdHEARTBEAT.mdBOOTSTRAP.mdMEMORY.md)のみが読み込まれます。

command-loggerの詳細

すべてのスラッシュコマンドを~/.openclaw/logs/commands.logに記録します。

boot-mdの詳細

gatewayの起動時に、アクティブなワークスペースのBOOT.mdを実行します。

Plugin Hooks

Pluginsは、より深い統合のためにPlugin SDKを通じてHooksを登録できます。たとえば、ツール呼び出しのインターセプト、プロンプトの変更、メッセージフローの制御などです。Plugin SDKは、モデル解決、エージェントライフサイクル、メッセージフロー、ツール実行、subagent調整、gateway lifecycleをカバーする28個のHooksを公開しています。 before_tool_callbefore_agent_replybefore_install、およびその他すべてのplugin hooksを含む完全なplugin hookリファレンスについては、Plugin Architectureを参照してください。

設定

{
  "hooks": {
    "internal": {
      "enabled": true,
      "entries": {
        "session-memory": { "enabled": true },
        "command-logger": { "enabled": false }
      }
    }
  }
}
Hookごとの環境変数:
{
  "hooks": {
    "internal": {
      "entries": {
        "my-hook": {
          "enabled": true,
          "env": { "MY_CUSTOM_VAR": "value" }
        }
      }
    }
  }
}
追加のhook directory:
{
  "hooks": {
    "internal": {
      "load": {
        "extraDirs": ["/path/to/more/hooks"]
      }
    }
  }
}
従来のhooks.internal.handlers配列設定形式も後方互換性のため引き続きサポートされていますが、新しいHooksでは検出ベースのシステムを使用してください。

CLIリファレンス

# すべてのHooksを一覧表示(--eligible、--verbose、または--jsonを追加可能)
openclaw hooks list

# Hookの詳細情報を表示
openclaw hooks info <hook-name>

# 適格性の概要を表示
openclaw hooks check

# 有効化/無効化
openclaw hooks enable <hook-name>
openclaw hooks disable <hook-name>

ベストプラクティス

  • ハンドラーは高速に保つ。 Hooksはコマンド処理中に実行されます。重い処理はvoid processInBackground(event)でfire-and-forgetにしてください。
  • エラーは適切に処理する。 危険な操作はtry/catchで囲み、他のハンドラーが実行できるようthrowしないでください。
  • イベントは早めにフィルタする。 イベントのtype/actionが関係ない場合は即座にreturnしてください。
  • 具体的なイベントキーを使う。 オーバーヘッドを減らすため、"events": ["command"]より"events": ["command:new"]を優先してください。

トラブルシューティング

Hookが検出されない

# ディレクトリ構造を確認
ls -la ~/.openclaw/hooks/my-hook/
# 表示されるべきもの: HOOK.md, handler.ts

# 検出されたすべてのHooksを一覧表示
openclaw hooks list

Hookが適格でない

openclaw hooks info my-hook
不足しているバイナリ(PATH)、環境変数、設定値、またはOS互換性を確認してください。

Hookが実行されない

  1. Hookが有効か確認します: openclaw hooks list
  2. Hooksが再読み込みされるよう、gateway processを再起動します。
  3. gateway logsを確認します: ./scripts/clawlog.sh | grep hook

関連