{
"event": "PreToolUse",
"tool_name": "Edit",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/UseCases\/Chat\/ExportChatSessionUseCase.php",
"old_string": "$score = isset($sourceData['score']) ? round((float) $sourceData['score'] * 100) . '%' : '';",
"new_string": "$score = isset($sourceData['score']) ? round((float) $sourceData['score'] * Constants::PERCENT_FULL) . '%' : '';"
}
}
{
"tool_response": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/UseCases\/Chat\/ExportChatSessionUseCase.php",
"oldString": "$score = isset($sourceData['score']) ? round((float) $sourceData['score'] * 100) . '%' : '';",
"newString": "$score = isset($sourceData['score']) ? round((float) $sourceData['score'] * Constants::PERCENT_FULL) . '%' : '';",
"originalFile": "<?php\n\ndeclare(strict_types=1);\n\nnamespace UseCases\\Chat;\n\n\/\/ @responsibility: Exportiert Chat-Sessions als Markdown oder JSON\n\nuse Domain\\Constants;\nuse Domain\\Repository\\ChatMessageRepositoryInterface;\nuse Domain\\Repository\\ChatSessionRepositoryInterface;\n\nfinal class ExportChatSessionUseCase\n{\n public function __construct(\n private ChatSessionRepositoryInterface $sessionRepo,\n private ChatMessageRepositoryInterface $messageRepo\n ) {\n }\n\n \/**\n * Export session as Markdown.\n *\/\n public function exportAsMarkdown(string $uuid): ?string\n {\n $session = $this->sessionRepo->findByUuid($uuid);\n\n if ($session === null) {\n return null;\n }\n\n $messages = $this->messageRepo->findBySessionId($session->getId() ?? 0);\n $title = $session->getTitle() ?? 'Chat';\n $date = date('d.m.Y H:i');\n $model = $session->getModel();\n\n $md = \"# {$title}\\n\";\n $md .= \"*Exportiert am {$date}*\\n\";\n $md .= \"*Modell: {$model}*\\n\\n\";\n $md .= \"---\\n\\n\";\n\n $questionNum = 0;\n foreach ($messages as $msg) {\n if ($msg->role()->isUser()) {\n $questionNum++;\n $md .= \"## Frage {$questionNum}\\n\\n\";\n $md .= $msg->content()->value() . \"\\n\\n\";\n } else {\n $md .= \"## Antwort {$questionNum}\\n\\n\";\n $md .= $msg->content()->value() . \"\\n\\n\";\n\n $sources = $msg->metadata()->sources() ?? [];\n if (!empty($sources)) {\n $md .= \"**Quellen:**\\n\";\n foreach ($sources as $source) {\n $sourceData = is_string($source) ? json_decode($source, true) : $source;\n if (!is_array($sourceData)) {\n continue;\n }\n $sourceTitle = $sourceData['title'] ?? 'Unbekannt';\n $score = isset($sourceData['score']) ? round((float) $sourceData['score'] * 100) . '%' : '';\n $collection = isset($sourceData['collection']) ? \"[{$sourceData['collection']}] \" : '';\n $md .= \"- {$collection}{$sourceTitle} ({$score})\\n\";\n }\n $md .= \"\\n\";\n }\n\n $md .= \"---\\n\\n\";\n }\n }\n\n return $md;\n }\n\n \/**\n * Export session as JSON.\n *\n * @return array<string, mixed>|null\n *\/\n public function exportAsJson(string $uuid): ?array\n {\n $session = $this->sessionRepo->findByUuid($uuid);\n\n if ($session === null) {\n return null;\n }\n\n $messages = $this->messageRepo->findBySessionId($session->getId() ?? 0);\n\n $exportMessages = [];\n foreach ($messages as $msg) {\n $exportMsg = [\n 'role' => $msg->role()->value,\n 'content' => $msg->content()->value(),\n 'created_at' => $msg->createdAt()->format('Y-m-d H:i:s'),\n ];\n\n if ($msg->role()->isAssistant()) {\n $sources = $msg->metadata()->sources() ?? [];\n $parsedSources = [];\n foreach ($sources as $source) {\n $parsedSources[] = is_string($source) ? json_decode($source, true) : $source;\n }\n $exportMsg['sources'] = $parsedSources;\n $exportMsg['tokens'] = [\n 'input' => $msg->tokens()->input(),\n 'output' => $msg->tokens()->output(),\n ];\n $exportMsg['model'] = $msg->model();\n }\n\n $exportMessages[] = $exportMsg;\n }\n\n return [\n 'session' => [\n 'uuid' => $session->getUuid(),\n 'title' => $session->getTitle() ?? 'Chat',\n 'created_at' => $session->getCreatedAt()->format('Y-m-d H:i:s'),\n 'model' => $session->getModel(),\n 'collections' => $session->getCollections(),\n ],\n 'messages' => $exportMessages,\n 'exported_at' => date('c'),\n ];\n }\n\n \/**\n * Generate filename for export.\n *\/\n public function generateFilename(string $uuid, string $format): string\n {\n $session = $this->sessionRepo->findByUuid($uuid);\n $title = $session?->getTitle() ?? 'chat';\n\n \/\/ Sanitize title for filename\n $title = preg_replace('\/[^a-zA-Z0-9äöüÄÖÜß\\-_\\s]\/u', '', $title) ?? '';\n $title = preg_replace('\/\\s+\/', '-', trim($title)) ?? '';\n $title = mb_substr($title, 0, 50);\n\n if ($title === '') {\n $title = 'chat';\n }\n\n $date = date('Y-m-d');\n $ext = $format === 'json' ? 'json' : 'md';\n\n return \"chat-{$title}-{$date}.{$ext}\";\n }\n}\n",
"structuredPatch": [
{
"oldStart": 58,
"oldLines": 7,
"newStart": 58,
"newLines": 7,
"lines": [
" continue;",
" }",
" $sourceTitle = $sourceData['title'] ?? 'Unbekannt';",
"- $score = isset($sourceData['score']) ? round((float) $sourceData['score'] * 100) . '%' : '';",
"+ $score = isset($sourceData['score']) ? round((float) $sourceData['score'] * Constants::PERCENT_FULL) . '%' : '';",
" $collection = isset($sourceData['collection']) ? \"[{$sourceData['collection']}] \" : '';",
" $md .= \"- {$collection}{$sourceTitle} ({$score})\\n\";",
" }"
]
}
],
"userModified": false,
"replaceAll": false
}
}