Session-Hooks
Mithooks können Sie sich in die einzelnen Lebenszyklusphasen einer Copilot-Session einklinken.
Tool-Ausführungssteuerung, Audit-Logs, Prompt-Anreicherung, Fehlerbehandlung usw. lassen sich hinzufügen, ohne die Kernimplementierung zu ändern.
Diese Funktion ist unabhängig von deklarativen hooks in Definitionen benutzerdefinierter Agenten und vom Laden dateibasierter Hooks. Für Einstellungen pro Agent siehe Benutzerdefinierte Agenten.
Discovery dateibasierter Hooks
InhookDirectories können Sie explizite Roots angeben, in denen dateibasierte Hooks gesucht werden.
Diese dienen nur der Discovery und gewähren dem Agenten keinen allgemeinen Dateizugriff.
Explizite Roots sind auch dann nutzbar, wenn enableConfigDiscovery oder enableFileHooks deaktiviert ist.
Relative Pfade werden einmalig relativ zu dem workingDirectory aufgelöst, das beim Setzen gilt.
- Weggelassen oder
null: Andere Discovery-Quellen bleiben unverändert []: Entfernt nur die explizit gesetzten SDK-Roots
enableFileHooks steuert Datei-Hooks aus dem Repository (.github/hooks/ und Roots aus vertrauenswürdigen Repository-Einstellungen).
Explizite hookDirectories und PHP-Callback-hooks werden dadurch nicht deaktiviert.
Ablauf der Hooks
Grundlegende Verwendung
Verfügbare Hooks
Wird
null zurückgegeben, läuft das Standardverhalten weiter.
Prompts blockieren
onUserPromptSubmitted kann einen Prompt ablehnen, indem es decision: 'block' zurückgibt.
Bei einer Ablehnung wird kein Modell-Turn gestartet und auch keine User-Nachricht aufgezeichnet.
Wenn Sie reason angeben, wird der Inhalt in ein temporäres session.warning-Event mit warningType: "policy_blocked" aufgenommen.
Typische Anwendungsfälle
1) Berechtigungssteuerung (Ausführungskontrolle)
- Zulassene Tools per Allow-List über
onPreToolUse - Destruktive Operationen mit
permissionDecision: 'ask'menschlich freigeben lassen - Über
permissionDecisionReasonden Ablehnungsgrund explizit machen - Kandidaten für
toolNamefinden Sie in der Liste unter Tools (z. B.view,glob,bash)
2) Auditing / Compliance
- Audit-Ereignisse durch Kombination der Lebenszyklus-Hooks sammeln
- Gesammelte Daten pro Session-ID persistieren
3) Prompt-Anreicherung
- In
onSessionStartProjektinformationen (Sprache, Framework, Konventionen) viaadditionalContextergänzen - In
onUserPromptSubmittedShortcuts (/fix,/test) expandieren
4) Ergebnisfilterung
- In
onPostToolUseAPI-Keys / Tokens / Passwörter maskieren - Zu lange Ergebnisse zusammenfassen und Details nur bei Bedarf ausgeben
5) Fehler-Recovery
- In
onErrorOccurrednur beimodel_callundrecoverable=trueeinenretryausführen - Nicht wiederherstellbare Fälle über
userNotificationknapp an den Nutzer melden
6) Session-Metriken
- In
onSessionStartdie Startzeit erfassen - In
onPreToolUse/onUserPromptSubmittedZähler aktualisieren - In
onSessionEndDauer, Anzahl der Tool-Aufrufe und Abschlussgrund ausgeben
Hook-Input-/Output-Typen
Gemeinsame Eingabe (BaseHookInput)
agentId / agentType / parentAgentId sind in Hooks verfügbar, deren Akteur ein Subagent ist.
In Hooks des Root-Agenten sind sie nicht enthalten.
Ältere Runtimes lassen die Felder ganz weg, wenn keine Informationen vorliegen.
Daher können alle drei null sein.
PreToolUseHookInput
PreToolUseHookOutput
PostToolUseHookInput
PostToolUseHookOutput
UserPromptSubmittedHookInput
UserPromptSubmittedHookOutput
SessionStartHookInput
SessionStartHookOutput
SessionEndHookInput
SessionEndHookOutput
ErrorOccurredHookInput
ErrorOccurredHookOutput
ToolResultObject
Standard-Objekt für Tool-Ausführungsergebnisse.Best Practices
- Führen Sie schwere synchrone Verarbeitung nicht direkt im Hook aus. Bei Bedarf asynchron auslagern.
- Wenn keine Änderung nötig ist, geben Sie
nullzurück und überlassen den Standardablauf. - Setzen Sie
permissionDecisionmöglichst explizit. - Unterdrücken Sie kritische Fehler nicht zu stark – halten Sie Log-/Notification-Pfade offen.
- Verwalten Sie Session-bezogenen Zustand auf Basis der Session-ID und räumen Sie ihn in
onSessionEndauf.
Aktuelle Informationen finden Sie im GitHub-Repository.