セッションフック
hooks を使うと、Copilot セッションの各ライフサイクルで処理を差し込めます。ツール実行制御、監査ログ、プロンプト補強、エラーハンドリングなどを、コア実装を変更せずに追加できます。 これはカスタムエージェント定義内の宣言型
hooks や、ファイルベースフック読み込みとは別の機能です。エージェント単位の設定はカスタムエージェントを参照してください。
ファイルベースフックの検出
hookDirectories には、ファイルベースフックを検出する明示的なルートを指定できます。
これは検出専用で、エージェントに一般的なファイルアクセス権限を付与しません。
enableConfigDiscovery や enableFileHooks が無効でも明示ルートは利用できます。
相対パスは、指定時の有効な workingDirectory を基準に一度だけ解決されます。
- 省略または
null:他の検出元を変更しません []:明示したSDKルートだけをクリアします
enableFileHooks はリポジトリ由来のファイルフック(.github/hooks/ や信頼されたリポジトリ設定のルート)を制御します。
明示的な hookDirectories やPHPコールバックの hooks は無効化しません。
フックの流れ
基本的な使い方
利用可能なフック
null を返すとデフォルト動作が継続されます。
プロンプトのブロック
onUserPromptSubmitted は decision: 'block' を返してプロンプトを拒否できます。
拒否された場合、モデルターンは開始されず、ユーザーメッセージも記録されません。
reason を指定すると、その内容が warningType: "policy_blocked" の一時的な session.warning イベントに含まれます。
代表的なユースケース
1) Permission control(実行制御)
onPreToolUseで許可ツールを allow-list 方式にする- 破壊的操作は
permissionDecision: 'ask'で人間承認 permissionDecisionReasonで拒否理由を明示toolNameの候補は Tools の一覧で確認する(例:view,glob,bash)
2) Auditing / compliance(監査)
- ライフサイクルフックを組み合わせて監査イベントを収集
- 収集データはセッションID単位で永続化
3) Prompt enrichment(入力補強)
onSessionStartでプロジェクト情報(言語、FW、規約)をadditionalContextに追加onUserPromptSubmittedでショートカット(/fix,/test)を展開
4) Result filtering(結果整形)
onPostToolUseで API key / token / password などをマスク- 長すぎる結果は要約化し、必要時のみ詳細を返す
5) Error recovery(障害復旧)
onErrorOccurredでmodel_callかつrecoverable=trueのときだけretry- 非回復系は
userNotificationで利用者向けに簡潔に通知
6) Session metrics(計測)
onSessionStartで開始時刻を記録onPreToolUse/onUserPromptSubmittedでカウンタ更新onSessionEndで所要時間・ツール回数・終了理由を出力
Hook input / output 型
共通入力(BaseHookInput)
agentId / agentType / parentAgentId は、サブエージェントがアクターとなるフックで利用できます。
ルートエージェントのフックには含まれません。
古いランタイムでは情報がない場合にフィールド自体が省略されます。
そのため、いずれも null になることがあります。
PreToolUseHookInput
PreToolUseHookOutput
PostToolUseHookInput
PostToolUseHookOutput
UserPromptSubmittedHookInput
UserPromptSubmittedHookOutput
SessionStartHookInput
SessionStartHookOutput
SessionEndHookInput
SessionEndHookOutput
ErrorOccurredHookInput
ErrorOccurredHookOutput
ToolResultObject
ツール実行結果の標準オブジェクトです。ベストプラクティス
- 重い同期処理はフック内で直接実行しすぎない。必要なら非同期化する。
- 変更不要なときは
nullを返してデフォルト動作に任せる。 permissionDecisionは可能な限り明示する。- クリティカルエラーは抑制しすぎず、ログ/通知経路を持つ。
- セッション単位の状態は session id ベースで管理し、
onSessionEndで掃除する。
最新情報は GitHub リポジトリ を参照してください。