Session Hook
透過hooks 可於 Copilot session 的各生命週期插入處理。
可在不改動核心實作的情況下,加入工具執行控制、稽核日誌、prompt 補強、錯誤處理等功能。
這與自訂 agent 定義中的宣告式 hooks 及檔案型 hook 載入是不同的功能。Agent 層級的設定請參閱自訂 Agent。
檔案型 hook 的探索
hookDirectories 可指定用於探索檔案型 hook 的明確根目錄。
此設定僅用於探索,不會授予 agent 一般的檔案存取權限。
即使停用 enableConfigDiscovery 或 enableFileHooks,仍可使用明確指定的根目錄。
相對路徑會以指定當下有效的 workingDirectory 為基準,僅解析一次。
- 省略或
null:不變更其他探索來源 []:僅清除明確指定的 SDK 根目錄
enableFileHooks 控制來自儲存庫的檔案型 hook(.github/hooks/ 及受信任儲存庫設定中的根目錄)。
它不會停用明確指定的 hookDirectories 或 PHP 回呼的 hooks。
Hook 流程
基本用法
可用 hook
回傳
null 時會繼續預設行為。
封鎖 prompt
onUserPromptSubmitted 可回傳 decision: 'block' 來拒絕 prompt。
被拒絕時不會開始模型 turn,也不會記錄使用者訊息。
若指定 reason,其內容會包含在 warningType: "policy_blocked" 的暫時性 session.warning 事件中。
常見的使用情境
1) Permission control(執行控制)
- 於
onPreToolUse以 allow-list 方式管理允許的工具 - 破壞性操作以
permissionDecision: 'ask'進行人為核准 - 以
permissionDecisionReason明示拒絕原因 toolName的候選項可從 Tools 的清單確認(如view,glob,bash)
2) Auditing / compliance(稽核)
- 組合生命週期 hook 蒐集稽核事件
- 蒐集到的資料以 session ID 為單位持久化
3) Prompt enrichment(輸入補強)
- 於
onSessionStart將專案資訊(語言、框架、規範)加入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 可在由 subagent 作為 actor 的 hook 中使用。
根 agent 的 hook 不會包含這些欄位。
在較舊的執行期中,缺少資訊時會直接省略欄位本身。
因此,這些值都可能為 null。
PreToolUseHookInput
PreToolUseHookOutput
PostToolUseHookInput
PostToolUseHookOutput
UserPromptSubmittedHookInput
UserPromptSubmittedHookOutput
SessionStartHookInput
SessionStartHookOutput
SessionEndHookInput
SessionEndHookOutput
ErrorOccurredHookInput
ErrorOccurredHookOutput
ToolResultObject
工具執行結果的標準物件。最佳實踐
- 不要在 hook 內直接執行過重的同步處理,如有必要請改為非同步。
- 不需變更時回傳
null,交由預設行為。 - 盡可能明確指定
permissionDecision。 - 對關鍵錯誤不要過度抑制,保有日誌 / 通知的路徑。
- Session 層級狀態以 session id 為基準管理,並於
onSessionEnd清理。
最新資訊請參考 GitHub 儲存庫。