{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Domain\/Factory\/ChatMessageFactory.php",
"content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Domain\\Factory;\n\n\/\/ @responsibility: Factory for creating ChatMessage entities with complex construction logic\n\nuse Domain\\Entity\\ChatMessage;\nuse Domain\\ValueObject\\MessageContent;\nuse Domain\\ValueObject\\MessageMetadata;\nuse Domain\\ValueObject\\MessageRole;\nuse Domain\\ValueObject\\MessageTiming;\nuse Domain\\ValueObject\\TokenCount;\n\nfinal class ChatMessageFactory\n{\n \/**\n * Create from database row.\n *\n * @param array<string, mixed> $data\n *\/\n public static function fromArray(array $data): ChatMessage\n {\n $content = MessageContent::fromStringOrEmpty($data['content']);\n $role = MessageRole::from($data['role']);\n\n $tokens = TokenCount::fromNullable(\n isset($data['tokens_input']) ? (int) $data['tokens_input'] : null,\n isset($data['tokens_output']) ? (int) $data['tokens_output'] : null\n );\n\n $timing = MessageTiming::create(\n isset($data['start_microtime']) ? (float) $data['start_microtime'] : null,\n isset($data['end_microtime']) ? (float) $data['end_microtime'] : null\n );\n\n $metadata = MessageMetadata::create(\n self::decodeJson($data['sources'] ?? null),\n self::decodeJson($data['collections'] ?? null),\n self::decodeJson($data['chunks_used'] ?? null),\n isset($data['context_limit']) ? (int) $data['context_limit'] : null\n );\n\n $createdAt = isset($data['created_at'])\n ? new \\DateTimeImmutable($data['created_at'])\n : new \\DateTimeImmutable();\n\n return ChatMessage::reconstituteFromPersistence(\n isset($data['id']) ? (int) $data['id'] : null,\n (int) $data['session_id'],\n $role,\n $content,\n $data['model'] ?? null,\n $tokens,\n $timing,\n $metadata,\n isset($data['author_profile_id']) ? (int) $data['author_profile_id'] : null,\n isset($data['system_prompt_id']) ? (int) $data['system_prompt_id'] : null,\n isset($data['llm_request_id']) ? (int) $data['llm_request_id'] : null,\n $createdAt\n );\n }\n\n \/**\n * @return array<mixed>|null\n *\/\n private static function decodeJson(?string $json): ?array\n {\n if ($json === null) {\n return null;\n }\n\n $decoded = json_decode($json, true);\n\n return is_array($decoded) ? $decoded : null;\n }\n}\n"
}
}
{
"tool_response": {
"type": "create",
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Domain\/Factory\/ChatMessageFactory.php",
"content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Domain\\Factory;\n\n\/\/ @responsibility: Factory for creating ChatMessage entities with complex construction logic\n\nuse Domain\\Entity\\ChatMessage;\nuse Domain\\ValueObject\\MessageContent;\nuse Domain\\ValueObject\\MessageMetadata;\nuse Domain\\ValueObject\\MessageRole;\nuse Domain\\ValueObject\\MessageTiming;\nuse Domain\\ValueObject\\TokenCount;\n\nfinal class ChatMessageFactory\n{\n \/**\n * Create from database row.\n *\n * @param array<string, mixed> $data\n *\/\n public static function fromArray(array $data): ChatMessage\n {\n $content = MessageContent::fromStringOrEmpty($data['content']);\n $role = MessageRole::from($data['role']);\n\n $tokens = TokenCount::fromNullable(\n isset($data['tokens_input']) ? (int) $data['tokens_input'] : null,\n isset($data['tokens_output']) ? (int) $data['tokens_output'] : null\n );\n\n $timing = MessageTiming::create(\n isset($data['start_microtime']) ? (float) $data['start_microtime'] : null,\n isset($data['end_microtime']) ? (float) $data['end_microtime'] : null\n );\n\n $metadata = MessageMetadata::create(\n self::decodeJson($data['sources'] ?? null),\n self::decodeJson($data['collections'] ?? null),\n self::decodeJson($data['chunks_used'] ?? null),\n isset($data['context_limit']) ? (int) $data['context_limit'] : null\n );\n\n $createdAt = isset($data['created_at'])\n ? new \\DateTimeImmutable($data['created_at'])\n : new \\DateTimeImmutable();\n\n return ChatMessage::reconstituteFromPersistence(\n isset($data['id']) ? (int) $data['id'] : null,\n (int) $data['session_id'],\n $role,\n $content,\n $data['model'] ?? null,\n $tokens,\n $timing,\n $metadata,\n isset($data['author_profile_id']) ? (int) $data['author_profile_id'] : null,\n isset($data['system_prompt_id']) ? (int) $data['system_prompt_id'] : null,\n isset($data['llm_request_id']) ? (int) $data['llm_request_id'] : null,\n $createdAt\n );\n }\n\n \/**\n * @return array<mixed>|null\n *\/\n private static function decodeJson(?string $json): ?array\n {\n if ($json === null) {\n return null;\n }\n\n $decoded = json_decode($json, true);\n\n return is_array($decoded) ? $decoded : null;\n }\n}\n",
"structuredPatch": [],
"originalFile": null
}
}