Protokoll #15694
| ID | 15694 |
|---|---|
| Zeitstempel | 2025-12-25 16:56:22.059898 |
| Client | root |
| IP | Warning: Undefined array key "request_ip" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 |
| Modell | claude-sonnet-4-20250514 |
| Status | pending |
| Tokens | 5,700 (Input: 0, Output: 0) |
| Dauer | - |
| Request-Zeit | Warning: Undefined array key "request_timestamp" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 18 |
| Response-Zeit | - |
Warning: Undefined array key "error_message" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 22
Request
{
"event": "PostToolUse",
"raw_data": {
"session_id": "f0f145c4-ac1d-417a-b15b-271983ae648b",
"transcript_path": "\/root\/.claude\/projects\/-var-www\/f0f145c4-ac1d-417a-b15b-271983ae648b.jsonl",
"cwd": "\/var\/www\/dev.campus.systemische-tools.de",
"permission_mode": "acceptEdits",
"hook_event_name": "PostToolUse",
"tool_name": "TaskOutput",
"tool_input": {
"task_id": "ab170d9",
"block": false,
"timeout": 30000
},
"tool_response": {
"retrieval_status": "not_ready",
"task": {
"task_id": "ab170d9",
"task_type": "local_agent",
"status": "running",
"description": "Refactor contract_tools.py modular",
"output": "[Tool: Read] {\"file_path\":\"\/var\/www\/CLAUDE.md\"}\n[Tool: Read] {\"file_path\":\"\/var\/www\/tools\/ki-protokoll\/claude-hook\/knowledge\/contract_tools.py\"}\n[Tool: Read] {\"file_path\":\"\/var\/www\/tools\/ki-protokoll\/claude-hook\/knowledge\/contract_tools.py\"}\n[Tool: Glob] {\"pattern\":\"**\/contract_tools.py\",\"path\":\"\/var\/www\"}\n[Tool: Read] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools.py\"}\n[Tool: Read] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools.py\"}\n[Tool: Bash] {\"command\":\"ls -la \/var\/www\/scripts\/python-check.sh\",\"description\":\"Check if python-check.sh exists\"}\n[Tool: Bash] {\"command\":\"ls \/var\/www\/mcp-servers\/mcp-contracts\/tools\/\",\"description\":\"List existing tools directory\"}\n[Tool: Bash] {\"command\":\"ls \/var\/www\/mcp-servers\/mcp-contracts\/tools\/\",\"description\":\"List existing tools directory\"}\n[Tool: Write] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools\/constants.py\",\"content\":\"\\\"\\\"\\\"Constants for Contract Tools\\\"\\\"\\\"\\n\\n# Error message limits\\nERROR_MESSAGE_MAX_LENGTH: int = 200\\n\\n# Default values\\nDEFAULT_VERSION: str = \\\"1.0\\\"\\nDEFAULT_STATUS: str = \\\"active\\\"\\nDEFAULT_CREATED_BY: str = \\\"mcp-contracts\\\"\\nDEFAULT_CHANGED_BY: str = \\\"mcp-contracts\\\"\\nDEFAULT_TRIGGERED_BY: str = \\\"mcp\\\"\\nDEFAULT_LIMIT: int = 20\\nDEFAULT_VIOLATIONS_LIMIT: int = 10\\nDEFAULT_VALIDATIONS_LIMIT: int = 5\\n\\n# Valid statuses\\nVALID_STATUSES: tuple[str, ...] = (\\\"draft\\\", \\\"active\\\", \\\"deprecated\\\")\\n\\n# Valid triggers\\nVALID_TRIGGERS: tuple[str, ...] = (\\\"mcp\\\", \\\"sync\\\", \\\"manual\\\", \\\"hook\\\")\\n\\n# Validation results\\nVALIDATION_PASSED: str = \\\"passed\\\"\\nVALIDATION_FAILED: str = \\\"failed\\\"\\n\\n# Log statuses\\nLOG_STATUS_SUCCESS: str = \\\"success\\\"\\nLOG_STATUS_ERROR: str = \\\"error\\\"\\nLOG_STATUS_DENIED: str = \\\"denied\\\"\\n\"}\n[Tool: Write] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools\/contract_parser.py\",\"content\":\"\\\"\\\"\\\"Contract YAML Parser Module\\\"\\\"\\\"\\nfrom typing import Any, Optional\\nimport yaml\\n\\n\\nclass ContractParseError(Exception):\\n \\\"\\\"\\\"Raised when contract YAML cannot be parsed\\\"\\\"\\\"\\n pass\\n\\n\\nclass ContractParser:\\n \\\"\\\"\\\"Handles parsing and validation of contract YAML content\\\"\\\"\\\"\\n\\n @staticmethod\\n def parse_yaml(yaml_content: str) -> dict[str, Any]:\\n \\\"\\\"\\\"\\n Parse YAML content into a dictionary.\\n\\n Args:\\n yaml_content: Raw YAML string\\n\\n Returns:\\n Parsed YAML as dictionary\\n\\n Raises:\\n ContractParseError: If YAML is invalid\\n \\\"\\\"\\\"\\n try:\\n data = yaml.safe_load(yaml_content)\\n if data is None:\\n raise ContractParseError(\\\"Empty YAML content\\\")\\n return data\\n except yaml.YAMLError as e:\\n raise ContractParseError(f\\\"Invalid YAML: {e}\\\") from e\\n\\n @staticmethod\\n def validate_yaml_syntax(yaml_content: str) -> tuple[bool, Optional[str]]:\\n \\\"\\\"\\\"\\n Validate YAML syntax without parsing into domain object.\\n\\n Args:\\n yaml_content: Raw YAML string\\n\\n Returns:\\n Tuple of (is_valid, error_message)\\n \\\"\\\"\\\"\\n try:\\n ContractParser.parse_yaml(yaml_content)\\n return True, None\\n except ContractParseError as e:\\n return False, str(e)\\n\\n @staticmethod\\n def extract_scope(contract_data: dict[str, Any]) -> Optional[str]:\\n \\\"\\\"\\\"\\n Extract scope from parsed contract data.\\n\\n Args:\\n contract_data: Parsed contract dictionary\\n\\n Returns:\\n Scope path or None if not found\\n \\\"\\\"\\\"\\n return contract_data.get(\\\"scope\\\")\\n\\n @staticmethod\\n def extract_rules(contract_data: dict[str, Any]) -> list[dict[str, Any]]:\\n \\\"\\\"\\\"\\n Extract rules from parsed contract data.\\n\\n Args:\\n contract_data: Parsed contract dictionary\\n\\n Returns:\\n List of rule dictionaries\\n \\\"\\\"\\\"\\n return contract_data.get(\\\"rules\\\", [])\\n\"}\n[Tool: Write] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools\/contract_validator.py\",\"content\":\"\\\"\\\"\\\"Contract Validation Module\\\"\\\"\\\"\\nfrom typing import Optional, Any\\nfrom datetime import datetime\\n\\nfrom domain.contracts import ContractValidation\\nfrom validators.contract_validator import run_contract_validation\\n\\nfrom .contract_parser import ContractParser\\nfrom .constants import VALIDATION_PASSED, VALIDATION_FAILED\\n\\n\\nclass ContractValidatorService:\\n \\\"\\\"\\\"Service for validating contracts against their rules\\\"\\\"\\\"\\n\\n def __init__(self, repository):\\n \\\"\\\"\\\"\\n Initialize validator service.\\n\\n Args:\\n repository: ContractRepository instance\\n \\\"\\\"\\\"\\n self.repository = repository\\n self.parser = ContractParser()\\n\\n def validate_contract(\\n self,\\n contract_id: int,\\n yaml_content: str,\\n path: Optional[str] = None,\\n triggered_by: str = \\\"mcp\\\",\\n start_time: float = 0.0\\n ) -> tuple[bool, dict[str, Any], Optional[int]]:\\n \\\"\\\"\\\"\\n Validate a contract and save the result.\\n\\n Args:\\n contract_id: ID of the contract being validated\\n yaml_content: YAML content of the contract\\n path: Optional specific path to validate\\n triggered_by: Who\/what triggered the validation\\n start_time: Start time for duration calculation\\n\\n Returns:\\n Tuple of (success, result_dict, validation_id)\\n \\\"\\\"\\\"\\n # Parse YAML\\n try:\\n contract_data = self.parser.parse_yaml(yaml_content)\\n except Exception as e:\\n return False, {\\\"error\\\": f\\\"Invalid contract YAML: {e}\\\"}, None\\n\\n # Run validation\\n try:\\n result = run_contract_validation(contract_data, path)\\n except Exception as e:\\n return False, {\\\"error\\\": f\\\"Validation failed: {e}\\\"}, None\\n\\n # Calculate duration\\n duration_ms = 0\\n if start_time > 0:\\n import time\\n duration_ms = int((time.time() - start_time) * 1000)\\n\\n # Save validation result\\n validation = ContractValidation(\\n contract_id=contract_id,\\n validated_at=datetime.now(),\\n result=VALIDATION_PASSED if result.outcome == \\\"passed\\\" else VALIDATION_FAILED,\\n critical_count=result.critical,\\n major_count=result.major,\\n minor_count=result.minor,\\n violations=result.findings,\\n triggered_by=triggered_by,\\n target_path=path,\\n duration_ms=duration_ms,\\n )\\n\\n try:\\n validation_id = self.repository.save_validation(validation)\\n except Exception as e:\\n return False, {\\\"error\\\": f\\\"Failed to save validation: {e}\\\"}, None\\n\\n return True, result.to_dict(), validation_id\\n\\n def get_latest_validations(\\n self,\\n contract_id: int,\\n limit: int = 10\\n ) -> list[dict[str, Any]]:\\n \\\"\\\"\\\"\\n Get latest validation results for a contract.\\n\\n Args:\\n contract_id: Contract ID\\n limit: Maximum number of results\\n\\n Returns:\\n List of validation dictionaries\\n \\\"\\\"\\\"\\n validations = self.repository.get_validations(contract_id, limit=limit)\\n return [v.to_dict() for v in validations]\\n\"}\n[Tool: Write] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools\/contract_reporter.py\",\"content\":\"\\\"\\\"\\\"Contract Reporting and Logging Module\\\"\\\"\\\"\\nimport time\\nimport json\\nfrom typing import Optional, Any, Callable\\n\\nfrom domain.contracts import LogEntry\\nfrom infrastructure.protokoll_logger import get_logger\\n\\nfrom .constants import (\\n ERROR_MESSAGE_MAX_LENGTH,\\n LOG_STATUS_SUCCESS,\\n LOG_STATUS_ERROR,\\n LOG_STATUS_DENIED\\n)\\n\\n\\nclass ContractReporter:\\n \\\"\\\"\\\"Handles logging and response formatting for contract operations\\\"\\\"\\\"\\n\\n def __init__(self):\\n \\\"\\\"\\\"Initialize reporter with logger\\\"\\\"\\\"\\n self.logger = get_logger()\\n\\n def log_operation(\\n self,\\n tool_name: str,\\n request_data: dict[str, Any],\\n status: str,\\n duration_ms: int,\\n error_message: Optional[str] = None\\n ) -> None:\\n \\\"\\\"\\\"\\n Log a contract operation.\\n\\n Args:\\n tool_name: Name of the tool\/operation\\n request_data: Request parameters as dict\\n status: Operation status (success, error, denied)\\n duration_ms: Duration in milliseconds\\n error_message: Optional error message\\n \\\"\\\"\\\"\\n request_str = json.dumps(request_data)\\n error_truncated = None\\n if error_message:\\n error_truncated = error_message[:ERROR_MESSAGE_MAX_LENGTH]\\n\\n log_entry = LogEntry(\\n tool_name=tool_name,\\n request=request_str,\\n status=status,\\n duration_ms=duration_ms,\\n error_message=error_truncated,\\n )\\n self.logger.log(log_entry)\\n\\n def execute_with_logging(\\n self,\\n tool_name: str,\\n request_data: dict[str, Any],\\n operation: Callable[[], dict[str, Any]]\\n ) -> dict[str, Any]:\\n \\\"\\\"\\\"\\n Execute an operation with automatic logging.\\n\\n Args:\\n tool_name: Name of the tool\/operation\\n request_data: Request parameters as dict\\n operation: Callable that executes the operation\\n\\n Returns:\\n Operation result dictionary\\n \\\"\\\"\\\"\\n start = time.time()\\n\\n try:\\n result = operation()\\n duration = int((time.time() - start) * 1000)\\n\\n # Log success\\n self.log_operation(\\n tool_name=tool_name,\\n reques... [TRUNCATED-0bf5f0a0e3c2a68c]",
"prompt": "Lese \/var\/www\/CLAUDE.md für Projektkontext.\n\n**Task #355: contract_tools.py - Modularisierung**\n\n1. Analysiere `\/var\/www\/tools\/ki-protokoll\/claude-hook\/knowledge\/contract_tools.py` (587 LOC)\n2. Gruppiere Funktionen nach Verantwortung\n3. Erstelle separate Module:\n - `contract_validator.py` - Validierungslogik\n - `contract_parser.py` - YAML-Parsing \n - `contract_reporter.py` - Reporting\/Output\n4. Ersetze Magic Numbers durch Konstanten\n5. Füge Type Hints hinzu\n6. Aktualisiere Imports in der Hauptdatei\n7. Führe `\/var\/www\/scripts\/python-check.sh` aus\n\nMax 300 LOC pro Modul. Schreibe die Module direkt.",
"result": "[Tool: Read] {\"file_path\":\"\/var\/www\/CLAUDE.md\"}\n[Tool: Read] {\"file_path\":\"\/var\/www\/tools\/ki-protokoll\/claude-hook\/knowledge\/contract_tools.py\"}\n[Tool: Read] {\"file_path\":\"\/var\/www\/tools\/ki-protokoll\/claude-hook\/knowledge\/contract_tools.py\"}\n[Tool: Glob] {\"pattern\":\"**\/contract_tools.py\",\"path\":\"\/var\/www\"}\n[Tool: Read] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools.py\"}\n[Tool: Read] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools.py\"}\n[Tool: Bash] {\"command\":\"ls -la \/var\/www\/scripts\/python-check.sh\",\"description\":\"Check if python-check.sh exists\"}\n[Tool: Bash] {\"command\":\"ls \/var\/www\/mcp-servers\/mcp-contracts\/tools\/\",\"description\":\"List existing tools directory\"}\n[Tool: Bash] {\"command\":\"ls \/var\/www\/mcp-servers\/mcp-contracts\/tools\/\",\"description\":\"List existing tools directory\"}\n[Tool: Write] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools\/constants.py\",\"content\":\"\\\"\\\"\\\"Constants for Contract Tools\\\"\\\"\\\"\\n\\n# Error message limits\\nERROR_MESSAGE_MAX_LENGTH: int = 200\\n\\n# Default values\\nDEFAULT_VERSION: str = \\\"1.0\\\"\\nDEFAULT_STATUS: str = \\\"active\\\"\\nDEFAULT_CREATED_BY: str = \\\"mcp-contracts\\\"\\nDEFAULT_CHANGED_BY: str = \\\"mcp-contracts\\\"\\nDEFAULT_TRIGGERED_BY: str = \\\"mcp\\\"\\nDEFAULT_LIMIT: int = 20\\nDEFAULT_VIOLATIONS_LIMIT: int = 10\\nDEFAULT_VALIDATIONS_LIMIT: int = 5\\n\\n# Valid statuses\\nVALID_STATUSES: tuple[str, ...] = (\\\"draft\\\", \\\"active\\\", \\\"deprecated\\\")\\n\\n# Valid triggers\\nVALID_TRIGGERS: tuple[str, ...] = (\\\"mcp\\\", \\\"sync\\\", \\\"manual\\\", \\\"hook\\\")\\n\\n# Validation results\\nVALIDATION_PASSED: str = \\\"passed\\\"\\nVALIDATION_FAILED: str = \\\"failed\\\"\\n\\n# Log statuses\\nLOG_STATUS_SUCCESS: str = \\\"success\\\"\\nLOG_STATUS_ERROR: str = \\\"error\\\"\\nLOG_STATUS_DENIED: str = \\\"denied\\\"\\n\"}\n[Tool: Write] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools\/contract_parser.py\",\"content\":\"\\\"\\\"\\\"Contract YAML Parser Module\\\"\\\"\\\"\\nfrom typing import Any, Optional\\nimport yaml\\n\\n\\nclass ContractParseError(Exception):\\n \\\"\\\"\\\"Raised when contract YAML cannot be parsed\\\"\\\"\\\"\\n pass\\n\\n\\nclass ContractParser:\\n \\\"\\\"\\\"Handles parsing and validation of contract YAML content\\\"\\\"\\\"\\n\\n @staticmethod\\n def parse_yaml(yaml_content: str) -> dict[str, Any]:\\n \\\"\\\"\\\"\\n Parse YAML content into a dictionary.\\n\\n Args:\\n yaml_content: Raw YAML string\\n\\n Returns:\\n Parsed YAML as dictionary\\n\\n Raises:\\n ContractParseError: If YAML is invalid\\n \\\"\\\"\\\"\\n try:\\n data = yaml.safe_load(yaml_content)\\n if data is None:\\n raise ContractParseError(\\\"Empty YAML content\\\")\\n return data\\n except yaml.YAMLError as e:\\n raise ContractParseError(f\\\"Invalid YAML: {e}\\\") from e\\n\\n @staticmethod\\n def validate_yaml_syntax(yaml_content: str) -> tuple[bool, Optional[str]]:\\n \\\"\\\"\\\"\\n Validate YAML syntax without parsing into domain object.\\n\\n Args:\\n yaml_content: Raw YAML string\\n\\n Returns:\\n Tuple of (is_valid, error_message)\\n \\\"\\\"\\\"\\n try:\\n ContractParser.parse_yaml(yaml_content)\\n return True, None\\n except ContractParseError as e:\\n return False, str(e)\\n\\n @staticmethod\\n def extract_scope(contract_data: dict[str, Any]) -> Optional[str]:\\n \\\"\\\"\\\"\\n Extract scope from parsed contract data.\\n\\n Args:\\n contract_data: Parsed contract dictionary\\n\\n Returns:\\n Scope path or None if not found\\n \\\"\\\"\\\"\\n return contract_data.get(\\\"scope\\\")\\n\\n @staticmethod\\n def extract_rules(contract_data: dict[str, Any]) -> list[dict[str, Any]]:\\n \\\"\\\"\\\"\\n Extract rules from parsed contract data.\\n\\n Args:\\n contract_data: Parsed contract dictionary\\n\\n Returns:\\n List of rule dictionaries\\n \\\"\\\"\\\"\\n return contract_data.get(\\\"rules\\\", [])\\n\"}\n[Tool: Write] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools\/contract_validator.py\",\"content\":\"\\\"\\\"\\\"Contract Validation Module\\\"\\\"\\\"\\nfrom typing import Optional, Any\\nfrom datetime import datetime\\n\\nfrom domain.contracts import ContractValidation\\nfrom validators.contract_validator import run_contract_validation\\n\\nfrom .contract_parser import ContractParser\\nfrom .constants import VALIDATION_PASSED, VALIDATION_FAILED\\n\\n\\nclass ContractValidatorService:\\n \\\"\\\"\\\"Service for validating contracts against their rules\\\"\\\"\\\"\\n\\n def __init__(self, repository):\\n \\\"\\\"\\\"\\n Initialize validator service.\\n\\n Args:\\n repository: ContractRepository instance\\n \\\"\\\"\\\"\\n self.repository = repository\\n self.parser = ContractParser()\\n\\n def validate_contract(\\n self,\\n contract_id: int,\\n yaml_content: str,\\n path: Optional[str] = None,\\n triggered_by: str = \\\"mcp\\\",\\n start_time: float = 0.0\\n ) -> tuple[bool, dict[str, Any], Optional[int]]:\\n \\\"\\\"\\\"\\n Validate a contract and save the result.\\n\\n Args:\\n contract_id: ID of the contract being validated\\n yaml_content: YAML content of the contract\\n path: Optional specific path to validate\\n triggered_by: Who\/what triggered the validation\\n start_time: Start time for duration calculation\\n\\n Returns:\\n Tuple of (success, result_dict, validation_id)\\n \\\"\\\"\\\"\\n # Parse YAML\\n try:\\n contract_data = self.parser.parse_yaml(yaml_content)\\n except Exception as e:\\n return False, {\\\"error\\\": f\\\"Invalid contract YAML: {e}\\\"}, None\\n\\n # Run validation\\n try:\\n result = run_contract_validation(contract_data, path)\\n except Exception as e:\\n return False, {\\\"error\\\": f\\\"Validation failed: {e}\\\"}, None\\n\\n # Calculate duration\\n duration_ms = 0\\n if start_time > 0:\\n import time\\n duration_ms = int((time.time() - start_time) * 1000)\\n\\n # Save validation result\\n validation = ContractValidation(\\n contract_id=contract_id,\\n validated_at=datetime.now(),\\n result=VALIDATION_PASSED if result.outcome == \\\"passed\\\" else VALIDATION_FAILED,\\n critical_count=result.critical,\\n major_count=result.major,\\n minor_count=result.minor,\\n violations=result.findings,\\n triggered_by=triggered_by,\\n target_path=path,\\n duration_ms=duration_ms,\\n )\\n\\n try:\\n validation_id = self.repository.save_validation(validation)\\n except Exception as e:\\n return False, {\\\"error\\\": f\\\"Failed to save validation: {e}\\\"}, None\\n\\n return True, result.to_dict(), validation_id\\n\\n def get_latest_validations(\\n self,\\n contract_id: int,\\n limit: int = 10\\n ) -> list[dict[str, Any]]:\\n \\\"\\\"\\\"\\n Get latest validation results for a contract.\\n\\n Args:\\n contract_id: Contract ID\\n limit: Maximum number of results\\n\\n Returns:\\n List of validation dictionaries\\n \\\"\\\"\\\"\\n validations = self.repository.get_validations(contract_id, limit=limit)\\n return [v.to_dict() for v in validations]\\n\"}\n[Tool: Write] {\"file_path\":\"\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools\/contract_reporter.py\",\"content\":\"\\\"\\\"\\\"Contract Reporting and Logging Module\\\"\\\"\\\"\\nimport time\\nimport json\\nfrom typing import Optional, Any, Callable\\n\\nfrom domain.contracts import LogEntry\\nfrom infrastructure.protokoll_logger import get_logger\\n\\nfrom .constants import (\\n ERROR_MESSAGE_MAX_LENGTH,\\n LOG_STATUS_SUCCESS,\\n LOG_STATUS_ERROR,\\n LOG_STATUS_DENIED\\n)\\n\\n\\nclass ContractReporter:\\n \\\"\\\"\\\"Handles logging and response formatting for contract operations\\\"\\\"\\\"\\n\\n def __init__(self):\\n \\\"\\\"\\\"Initialize reporter with logger\\\"\\\"\\\"\\n self.logger = get_logger()\\n\\n def log_operation(\\n self,\\n tool_name: str,\\n request_data: dict[str, Any],\\n status: str,\\n duration_ms: int,\\n error_message: Optional[str] = None\\n ) -> None:\\n \\\"\\\"\\\"\\n Log a contract operation.\\n\\n Args:\\n tool_name: Name of the tool\/operation\\n request_data: Request parameters as dict\\n status: Operation status (success, error, denied)\\n duration_ms: Duration in milliseconds\\n error_message: Optional error message\\n \\\"\\\"\\\"\\n request_str = json.dumps(request_data)\\n error_truncated = None\\n if error_message:\\n error_truncated = error_message[:ERROR_MESSAGE_MAX_LENGTH]\\n\\n log_entry = LogEntry(\\n tool_name=tool_name,\\n request=request_str,\\n status=status,\\n duration_ms=duration_ms,\\n error_message=error_truncated,\\n )\\n self.logger.log(log_entry)\\n\\n def execute_with_logging(\\n self,\\n tool_name: str,\\n request_data: dict[str, Any],\\n operation: Callable[[], dict[str, Any]]\\n ) -> dict[str, Any]:\\n \\\"\\\"\\\"\\n Execute an operation with automatic logging.\\n\\n Args:\\n tool_name: Name of the tool\/operation\\n request_data: Request parameters as dict\\n operation: Callable that executes the operation\\n\\n Returns:\\n Operation result dictionary\\n \\\"\\\"\\\"\\n start = time.time()\\n\\n try:\\n result = operation()\\n duration = int((time.time() - start) * 1000)\\n\\n # Log success\\n self.log_operation(\\n tool_name=tool_name,\\n reques... [TRUNCATED-0bf5f0a0e3c2a68c]"
}
},
"tool_use_id": "toolu_0145xEJfdHMNq1HWziWQ6oZ1"
}
}
Response
-