{
"event": "PostToolUse",
"tool_name": "Read",
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/tools\/ki-protokoll\/claude-hook\/log_to_db.py",
"content": "#!\/usr\/bin\/env python3\n\"\"\"\nClaude Code Hook Logger v3 - Modularisiert\nOrchestriert Parsing, Formatting und Storage von Hook-Events\n\"\"\"\n\nimport json\nimport sys\nfrom typing import Dict, Any, Optional\n\n# Importiere modularisierte Komponenten\nfrom log_parser import (\n parse_event_data,\n sanitize_data,\n get_conversation_pairs_from_session\n)\nfrom log_formatter import (\n format_request_to_json,\n format_response_to_json,\n create_response_data,\n calculate_tokens,\n get_client_metadata,\n get_model_name,\n format_tool_response,\n should_suppress_output\n)\nfrom log_storage import (\n find_matching_request,\n save_pending_request,\n insert_log_entry,\n update_request_with_response,\n close_pending_user_prompts\n)\n\n\ndef log_to_database(data: Dict[str, Any]) -> Optional[int]:\n \"\"\"\n Hauptfunktion: Orchestriert das Logging eines Events\n\n Args:\n data: Event-Daten vom Hook\n\n Returns:\n Database ID des Log-Eintrags oder None bei Fehler\n \"\"\"\n try:\n event_name = data.get('hook_event_name', 'Unknown')\n session_id = data.get('session_id', '')\n\n # Prüfe auf matching Request für Response-Events (PostToolUse)\n if event_name == 'PostToolUse':\n matching_request_id = find_matching_request(data)\n if matching_request_id:\n # Update existing request mit response\n tool_response = sanitize_data(data.get('tool_response', {}))\n response_str = format_tool_response(tool_response)\n tokens = calculate_tokens('', response_str)\n\n update_request_with_response(\n matching_request_id,\n response_str,\n tokens['tokens_output']\n )\n return matching_request_id\n\n # Bei Stop-Events: Schließe alle pending UserPrompts\n if event_name in ['Stop', 'SubagentStop'] and session_id:\n pairs = get_conversation_pairs_from_session(session_id)\n close_pending_user_prompts(session_id, pairs)\n\n # Parse Event-Daten\n request_data = parse_event_data(data)\n\n # Erstelle Response-Daten (falls direkt verfügbar)\n response_data = create_response_data(event_name, data)\n\n # Formatiere zu JSON\n request_str = format_request_to_json(request_data)\n response_str = format_response_to_json(response_data)\n",
"numLines": 80,
"startLine": 1,
"totalLines": 132
}
}
}