Protokoll #15694

ID15694
Zeitstempel2025-12-25 16:56:22.059898
Clientroot
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
Modellclaude-sonnet-4-20250514
Statuspending
Tokens5,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

-
← Vorheriger Zur Liste Nächster →