{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/tools\/ki-protokoll\/claude-hook\/log_formatter.py",
"content": "#!\/usr\/bin\/env python3\n\"\"\"\nLog Formatter Module\nVerantwortlich für die Formatierung von Log-Daten zu JSON und Response-Strukturierung\n\"\"\"\n\nimport json\nimport os\nfrom typing import Dict, Any, Optional\nfrom log_parser import estimate_tokens, get_client_ip\n\n\ndef format_request_to_json(request_data: Dict[str, Any]) -> str:\n \"\"\"Konvertiert Request-Daten zu JSON-String\"\"\"\n return json.dumps(request_data, ensure_ascii=False)\n\n\ndef format_response_to_json(response_data: Optional[Dict[str, Any]]) -> Optional[str]:\n \"\"\"Konvertiert Response-Daten zu JSON-String\"\"\"\n if response_data is None:\n return None\n return json.dumps(response_data, ensure_ascii=False)\n\n\ndef create_response_data(event_name: str, data: Dict[str, Any]) -> Optional[Dict[str, Any]]:\n \"\"\"Erstellt Response-Daten basierend auf Event-Typ\"\"\"\n if event_name in ['Stop', 'SubagentStop']:\n return {'status': 'completed'}\n\n if event_name in ['SessionStart', 'SessionEnd']:\n return {'status': 'logged'}\n\n return None\n\n\ndef calculate_tokens(request_str: str, response_str: Optional[str] = None) -> Dict[str, int]:\n \"\"\"Berechnet Token-Counts für Request und Response\"\"\"\n tokens_input = estimate_tokens(request_str)\n tokens_output = estimate_tokens(response_str) if response_str else 0\n tokens_total = tokens_input + tokens_output\n\n return {\n 'tokens_input': tokens_input,\n 'tokens_output': tokens_output,\n 'tokens_total': tokens_total\n }\n\n\ndef get_client_metadata() -> Dict[str, str]:\n \"\"\"Sammelt Client-Metadaten für Logging\"\"\"\n return {\n 'client_ip': get_client_ip(),\n 'client_name': os.environ.get('USER', 'unknown')\n }\n\n\ndef get_model_name() -> str:\n \"\"\"Gibt den verwendeten Model-Namen zurück\"\"\"\n return 'claude-sonnet-4-20250514'\n\n\ndef format_tool_response(tool_response: Any) -> str:\n \"\"\"Formatiert Tool-Response für Speicherung\"\"\"\n return json.dumps({'tool_response': tool_response}, ensure_ascii=False)\n\n\ndef should_suppress_output(event_name: str) -> bool:\n \"\"\"Bestimmt, ob Output für dieses Event unterdrückt werden soll\"\"\"\n return event_name in ['UserPromptSubmit', 'SessionStart']\n"
}
}
{
"tool_response": {
"type": "create",
"filePath": "\/var\/www\/tools\/ki-protokoll\/claude-hook\/log_formatter.py",
"content": "#!\/usr\/bin\/env python3\n\"\"\"\nLog Formatter Module\nVerantwortlich für die Formatierung von Log-Daten zu JSON und Response-Strukturierung\n\"\"\"\n\nimport json\nimport os\nfrom typing import Dict, Any, Optional\nfrom log_parser import estimate_tokens, get_client_ip\n\n\ndef format_request_to_json(request_data: Dict[str, Any]) -> str:\n \"\"\"Konvertiert Request-Daten zu JSON-String\"\"\"\n return json.dumps(request_data, ensure_ascii=False)\n\n\ndef format_response_to_json(response_data: Optional[Dict[str, Any]]) -> Optional[str]:\n \"\"\"Konvertiert Response-Daten zu JSON-String\"\"\"\n if response_data is None:\n return None\n return json.dumps(response_data, ensure_ascii=False)\n\n\ndef create_response_data(event_name: str, data: Dict[str, Any]) -> Optional[Dict[str, Any]]:\n \"\"\"Erstellt Response-Daten basierend auf Event-Typ\"\"\"\n if event_name in ['Stop', 'SubagentStop']:\n return {'status': 'completed'}\n\n if event_name in ['SessionStart', 'SessionEnd']:\n return {'status': 'logged'}\n\n return None\n\n\ndef calculate_tokens(request_str: str, response_str: Optional[str] = None) -> Dict[str, int]:\n \"\"\"Berechnet Token-Counts für Request und Response\"\"\"\n tokens_input = estimate_tokens(request_str)\n tokens_output = estimate_tokens(response_str) if response_str else 0\n tokens_total = tokens_input + tokens_output\n\n return {\n 'tokens_input': tokens_input,\n 'tokens_output': tokens_output,\n 'tokens_total': tokens_total\n }\n\n\ndef get_client_metadata() -> Dict[str, str]:\n \"\"\"Sammelt Client-Metadaten für Logging\"\"\"\n return {\n 'client_ip': get_client_ip(),\n 'client_name': os.environ.get('USER', 'unknown')\n }\n\n\ndef get_model_name() -> str:\n \"\"\"Gibt den verwendeten Model-Namen zurück\"\"\"\n return 'claude-sonnet-4-20250514'\n\n\ndef format_tool_response(tool_response: Any) -> str:\n \"\"\"Formatiert Tool-Response für Speicherung\"\"\"\n return json.dumps({'tool_response': tool_response}, ensure_ascii=False)\n\n\ndef should_suppress_output(event_name: str) -> bool:\n \"\"\"Bestimmt, ob Output für dieses Event unterdrückt werden soll\"\"\"\n return event_name in ['UserPromptSubmit', 'SessionStart']\n",
"structuredPatch": [],
"originalFile": null
}
}