Session hooks
Methooks kun je op elk punt in de lifecycle van een Copilot-session eigen logica invoegen.Zo voeg je uitvoeringscontrole voor tools, auditlogs, promptverrijking en foutafhandeling toe zonder de kernimplementatie te wijzigen. Dit is een andere functie dan de declaratieve
hooks in de definitie van een custom agent en het laden van file-based hooks. Zie Custom agents voor configuratie per agent.
File-based hooks detecteren
MethookDirectories geef je expliciete roots op waarin file-based hooks worden gedetecteerd.
Dit dient alleen voor detectie en geeft de agent geen algemene toegangsrechten tot bestanden.
Expliciete roots zijn ook bruikbaar als enableConfigDiscovery of enableFileHooks is uitgeschakeld.
Relatieve paden worden eenmalig opgelost ten opzichte van de effectieve workingDirectory op het moment van opgeven.
- Weglaten of
null: andere detectiebronnen blijven ongewijzigd []: alleen de expliciet opgegeven SDK-roots worden gewist
enableFileHooks regelt file hooks uit de repository (.github/hooks/ en roots uit vertrouwde repository-instellingen).
Expliciete hookDirectories en hooks met PHP-callbacks worden hiermee niet uitgeschakeld.
De flow van hooks
Basisgebruik
Beschikbare hooks
Als je
null retourneert, gaat het standaardgedrag gewoon door.
Een losse session eindigt niet wanneer het antwoord op een prompt klaar is. onSessionEnd wordt niet per prompt uitgevoerd, maar wanneer de session wordt verbroken of vernietigd.
Prompts blokkeren
onUserPromptSubmitted kan een prompt weigeren door decision: 'block' te retourneren.
Bij weigering start er geen model-turn en wordt het gebruikersbericht ook niet vastgelegd.
Als je reason opgeeft, wordt die inhoud opgenomen in een tijdelijk session.warning-event met warningType: "policy_blocked".
Typische use cases
1) Permission control (uitvoeringscontrole)
- Gebruik
onPreToolUseom toegestane tools via een allow-list te beheren - Laat destructieve operaties met
permissionDecision: 'ask'door een mens goedkeuren - Geef met
permissionDecisionReasonexpliciet de reden van weigering op - Bekijk de mogelijke waarden van
toolNamein het overzicht van Tools (bijv.view,glob,bash)
2) Auditing / compliance
- Combineer lifecycle-hooks om audit-events te verzamelen
- Sla de verzamelde data op per session-ID
3) Prompt enrichment (invoerverrijking)
- Voeg met
onSessionStartprojectinformatie (taal, framework, conventies) toe viaadditionalContext - Vouw met
onUserPromptSubmittedshortcuts uit (/fix,/test)
4) Result filtering (resultaten opschonen)
- Maskeer met
onPostToolUsezaken als API keys, tokens en wachtwoorden - Vat te lange resultaten samen en geef alleen op verzoek details terug
5) Error recovery (foutherstel)
- Voer met
onErrorOccurredalleen eenretryuit bijmodel_callmetrecoverable=true - Informeer bij niet-herstelbare fouten de gebruiker beknopt via
userNotification
6) Session metrics (meten)
- Leg met
onSessionStartde starttijd vast - Werk tellers bij in
onPreToolUse/onUserPromptSubmitted - Rapporteer met
onSessionEndde doorlooptijd, het aantal toolaanroepen en de eindreden
Hook input-/output-types
Gedeelde input (BaseHookInput)
agentId / agentType / parentAgentId zijn beschikbaar in hooks waarbij een subagent de actor is.
Ze worden niet meegegeven in hooks van de root-agent.
Oudere runtimes laten de velden helemaal weg als de informatie ontbreekt.
Daarom kunnen ze allemaal null zijn.
PreToolUseHookInput
PreToolUseHookOutput
PostToolUseHookInput
PostToolUseHookOutput
UserPromptSubmittedHookInput
UserPromptSubmittedHookOutput
SessionStartHookInput
SessionStartHookOutput
SessionEndHookInput
SessionEndHookOutput
ErrorOccurredHookInput
ErrorOccurredHookOutput
ToolResultObject
Het standaardobject voor toolresultaten.Best practices
- Voer zware synchrone verwerking niet direct in een hook uit; maak deze zo nodig asynchroon.
- Retourneer
nullals er niets hoeft te veranderen en laat het standaardgedrag zijn werk doen. - Maak
permissionDecisionwaar mogelijk expliciet. - Onderdruk kritieke fouten niet te veel en zorg voor een log-/notificatiekanaal.
- Beheer sessiestatus op basis van session-ID en ruim op in
onSessionEnd.
Raadpleeg de GitHub-repository voor de meest actuele informatie.